我希望使用Java来获取文件的MD5校验和.我真的很惊讶,但我找不到任何显示如何获取文件的MD5校验和的内容.
怎么做?
我在磁盘中有一个40MB的文件,我需要使用字节数组将其"映射"到内存中.
起初,我认为将文件写入ByteArrayOutputStream是最好的方法,但我发现在复制操作期间的某个时刻需要大约160MB的堆空间.
如果不使用RAM文件大小的三倍,有人知道更好的方法吗?
更新:感谢您的回答.我注意到我可以减少内存消耗,稍微告诉ByteArrayOutputStream的初始大小要比原始文件大小稍大一些(使用我的代码强制重新分配的确切大小,得到检查原因).
还有另一个高内存点:当我用ByteArrayOutputStream.toByteArray返回byte []时.看看它的源代码,我可以看到它正在克隆数组:
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
Run Code Online (Sandbox Code Playgroud)
我想我可以扩展ByteArrayOutputStream并重写此方法,以便直接返回原始数组.这里有没有潜在的危险,因为流和字节数组不会被多次使用?
关于你对我的"技巧"的看法,我有一个普遍的问题.
有2个文本文件(file_1和file_2)需要相互比较.两者都非常庞大(3-4千兆字节,每个30,000,000到45,000,000行).我的想法是读取file_1内存中的几行(尽可能多),然后将它们与所有行进行比较file_2.如果匹配,则匹配的两个文件中的行应写入新文件.继续接下来的1000行,file_1并将这些行与所有行进行比较,file_2直到我file_1完全通过.
但这对我来说实际上非常非常耗时且复杂.你能想到比较这两个文件的任何其他方法吗?
您认为比较可能需要多长时间?对于我的计划,时间并不重要.我没有使用过如此庞大的文件的经验,因此我不知道这需要多长时间.它不应该超过一天.;-)但我担心我的技术会永远存在......
刚出现在我脑海中的Antoher问题:你会在内存中读到多少行?越多越好?有没有办法在实际尝试之前确定可能的行数?我想尽可能多地阅读(因为我认为这更快)但我经常用完内存.
提前致谢.
编辑 我想我必须多解释一下我的问题.
目的不是看两个文件是否相同(它们不是).每个文件中都有一些共享相同"特征"的行.这是一个例子:
file_1看起来有点像这样:
mat1 1000 2000 TEXT //this means the range is from 1000 - 2000
mat1 2040 2050 TEXT
mat3 10000 10010 TEXT
mat2 20 500 TEXT
Run Code Online (Sandbox Code Playgroud)
file_2看起来像这样:
mat3 10009 TEXT
mat3 200 TEXT
mat1 999 TEXT
Run Code Online (Sandbox Code Playgroud)
TEXT是指对我不感兴趣的字符和数字,mat可以来自mat1 - mat50并且没有顺序; 也可以有1000倍mat2(但下一列中的数字是不同的).我需要以这样的方式找到拟合线:matX在两个比较线中是相同的,所提到的数字file_2符合上述范围file_1.所以在我的例子中我会找到一个匹配:第3行 …
java ×4
benchmarking ×1
bytearray ×1
caching ×1
caliper ×1
checksum ×1
comparison ×1
disk-io ×1
file ×1
md5 ×1