我试图计算传输文件的校验和。传统方式是接收文件并将其写入磁盘,然后再从磁盘读取并计算校验和。或者,我可以同时写入和读取来优化流程。我观察到如果我同时写入和读取它会完成更快,因为读取操作不会因为增加的缓存命中而进入磁盘。但是,我担心我的校验和计算是否仍然 可靠,因为我认为校验和计算的原因之一是检测磁盘写入错误?如果是这样,同时写入和读取会丢失磁盘写入错误吗?
FileOutputStream fos = new FileOutputStream("testwrite.jpg");
InputStream is = Files.newInputStream(Paths.get("testwrite.jpg"));
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
DigestInputStream dis = new DigestInputStream(is, md);
byte[] bufferWrite = new byte[4096];
byte[] bufferRead = new byte[4096];
long current = 0L;
long startTime = System.currentTimeMillis();
while (current < totalWriteSize) {
fos.write(bufferWrite, 0, 4096);
fos.flush();
dis.read(bufferRead);
current += 4096;
}
fos.close();
答案 0 :(得分:0)
正如您所说,如果目标是检查磁盘写入是否正确,那么从缓存中获取回读并不会检查。更重要的是,当您将整个内容写入磁盘并将其读回时,可能会发生同样的事情。您可能仍在从操作系统和/或驱动器本身的缓存中获取数据。为了真正检查磁盘上写的内容,您需要在回读之前清除所有这些缓存。
某些操作系统中有调用将所有挂起的写入数据刷新到磁盘,并进一步请求驱动器刷新其写入缓冲区,但我不知道调用也清除了所有的数据缓存,以便回读强制磁盘的物理读取。我能想到清除所有这些缓存的唯一可靠的方法是关闭系统并从驱动器上断电。