2013-07-18 34 views
0

我有一個互聯網上的文件的網址。我需要計算SHA1散列,並按每行讀取此文件。我知道如何做到這一點,但我讀了兩次這個文件,這可能不是一個很好的解決方案。如何讀取和計算互聯網上的文件的哈希值

我該如何更有效地做到這一點?

這裏是我的代碼:

URL url = new URL(url); 
URLConnection urlConnection = url.openConnection(); 
urlConnection.setConnectTimeout(1000); 
urlConnection.setReadTimeout(1000); 
logger.error(urlConnection.getContent() + " "); 
InputStream is = urlConnection.getInputStream(); 


// first reading of file is: 

int i; 
File file = new File("nameOfFile"); 
BufferedInputStream bis = new BufferedInputStream(is); 
BufferedOutputStream bos = 
      new BufferedOutputStream(new FileOutputStream(file.getName())); 
while ((i = bis.read()) != -1) { 
    bos.write(i); 
} 
bos.flush(); 
bis.close(); 
sha1(file); 

// second reading of file is: 

BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
String line; 

while ((line = reader.readLine()) != null) { 
    // do something 
} 

protected byte[] sha1(final File file) throws Exception { 
    if (file == null || !file.exists()) { 
     return null; 
    } 
    final MessageDigest messageDigest = MessageDigest.getInstance(SHA1); 

    InputStream is = new BufferedInputStream(new FileInputStream(file)); 
    try { 
     final byte[] buffer = new byte[1024]; 
     for (int read = 0; (read = is.read(buffer)) != -1;) { 
      messageDigest.update(buffer, 0, read); 
     } 
    } finally { 
     IOUtils.closeQuietly(is); 
    } 
    return messageDigest.digest(); 
} 
+0

一次讀取它,更新消息摘要,然後寫入輸出文件。另外,在你的第一個片段中,你一次只能讀寫一個字節,所以即使你有緩衝流,你也會多次循環不必要的。 –

回答

3

如果你之通過DigestInputStream,它會做的MessageDigest,仍然是可用作InputStream

DigestInputStream dis = new DigestInputStream(is, 
    MessageDigest.getInstance(SHA1)); 
BufferedInputStream bis = new BufferedInputStream(dis); 
BufferedOutputStream bos = new BufferedOutputStream(
    new FileOutputStream(file.getName())); 
while ((i = bis.read()) != -1) { 
    bos.write(i); 
} 
bos.close(); 
return dis.getMessageDigest().digest(); 
+0

這不計算我的文件sha的權利 – hudi

+0

以什麼方式?這似乎不太可能。 –

+0

問題是已經閱讀的文件是,我不能再讀它 – hudi