java - 如何读取和计算互联网上文​​件的哈希值

标签 java file stream

我在 Internet 上有一个文件的 URL。我需要计算 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();
}

最佳答案

如果你通过 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();

关于java - 如何读取和计算互联网上文​​件的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17729789/

相关文章:

java - 数据输入流困惑

java - 将 PostgreSQL 查询转换为 DSLContext 的问题

java - 当我运行下面给出的代码时,我收到 java.sql.SQLSyntaxErrorException

java - 使用 JNLP 启动 Applet 时找不到类异常

python 阅读行 w/o\n?

python - 如何在 Python 3 中将文本流编码为字节流?

java - Java SE 应用程序和 Java EE 应用程序之间的区别?

java - 如何在 java 应用程序中存储文件或文件路径?

android - 无法使用文件类删除文件

c# - 对于来自 URL 的大文件,在 ZipArchive 中抛出“System.OutOfMemoryException”