我的硬盘上有两个(每个2GB)文件,想要将它们相互比较:
java.io.FileInputStream两次读取并在每个字节的字节上比较字节数组需要20多分钟.java.io.BufferedInputStream 缓冲区为64kb,文件以块的形式读取然后进行比较.比较完成是一个紧凑的循环
int numRead = Math.min(numRead[0], numRead[1]);
for (int k = 0; k < numRead; k++)
{
if (buffer[1][k] != buffer[0][k])
{
return buffer[0][k] - buffer[1][k];
}
}
Run Code Online (Sandbox Code Playgroud)我该怎么做才能加快速度呢?NIO应该比普通的流更快吗?Java无法使用DMA/SATA技术,而是做一些缓慢的OS-API调用吗?
编辑:
谢谢你的答案.我做了一些基于它们的实验.安德烈亚斯表示
流或
nio方法没有太大差别.
更重要的是正确的缓冲区大小.
我的实验证实了这一点.由于文件是以大块读取的,因此即使是额外的缓冲区(BufferedInputStream)也不会提供任何内容.优化比较是可能的,并且我通过32次展开获得了最佳结果,但与磁盘读取相比,花费的时间比较小,因此加速很小.看起来我无能为力;-(
在我的文件夹中assets/data,有很多XML文件包含我的应用程序的静态数据.
有人可以很容易地检索APK,修改它的一部分并安装在设备上.
我想通过检查我的assets/data文件夹的完整性来阻止用户更改我的静态数据.
最初我考虑使用MD5校验和,但对于我将拥有的文件数量(50-100)可能太慢了.
你有什么建议吗?
编辑:
这个应用程序是一个带有描述每个级别的XML文件的游戏.
我正在解析位于Web服务器中的Xml文件并将解析后的数据存储到数据库中.对于我的应用程序我使用数据库中的数据.我只需要在修改文件时解析xml文件,否则无需解析.那我怎么知道文件被修改了?我知道我可以使用"if-modified-since"标题.但我需要一些"if-modified-since"标题的例子
请帮帮我.......
我编写了以下程序来计算Java中字符串的SHA-256哈希值:
public class ToHash {
public static void main(String[] args) {
byte[] data = "test".getBytes("UTF8");
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(data);
System.out.println(new BASE64Encoder().encode(hash));
}
}
Run Code Online (Sandbox Code Playgroud)
嗯,这很好.在下一步中,我想以接受文件并计算其哈希值的方式开发它.我的解决方案是在字符串数组中读取整个文件,并在该字符串数组上调用该digest()方法.但是有两个问题:
我不知道如何将整个文件读入数组?目前我认为我必须逐行阅读并附加一个带有新行的数组!
以上方法需要大量文件的大量内存!
这是我当前读取文件的程序:
public class ToHash {
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, FileNotFoundException, IOException {
// TODO code application logic here
// The name of the file to open.
String fileName = "C:\\Users\\ghasemi\\Desktop\\1.png";
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader(fileName));
while …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用apache commons-net进行ftp文件传输.
问题是文件间歇性地到达服务器损坏.'腐败'我的意思是winrar告诉我一个zip文件有一个'意外的归档结束'.有时文件是完全空的.我注意到,对于较大的文件(100kb +),这种情况更多,但对于小文件也会发生(20kb).
我知道上传的源zip文件是有效的,只有243kb.
我没有从代码中得到任何错误/异常.
这是正在执行的代码:
try
{
int CON_TIMEOUT = (int) TimeUnit.SECONDS.toMillis(20); // fail if can't connect within 20 seconds
int LIVE_TIMEOUT = (int) TimeUnit.MINUTES.toMillis(5); // allow up to 5 minutes for data transfers
FTPClient client = new FTPClient();
client.setConnectTimeout(CON_TIMEOUT);
client.setDataTimeout(LIVE_TIMEOUT);
client.connect(host);
client.setSoTimeout(LIVE_TIMEOUT);
client.login(user, pass);
client.changeWorkingDirectory(dir);
log("client ready");
File file = new File(filePath);
String name = new Date().getTime() + "-" + file.getName();
InputStream fis = null;
try
{
fis = new FileInputStream(file);
if (!client.storeFile(name, fis))
throw new RuntimeException("store …Run Code Online (Sandbox Code Playgroud) 当它连接到我的服务器时,是否可以检查我的用libGdx制作的应用程序是否是我制作的应用程序?我需要知道这一点,因为我希望能够检查人们是否更改/破解了我的应用.
或者,一旦它在appstore/Google Play商店上,人们就无法更改我的应用程序?
我必须指纹文件以匹配双线.在2013年推荐使用Java?我还应该比较文件大小,还是不必要的检查?
假阳性的概率应该非常接近0
编辑:很多答案,谢谢.今天的备份软件标准是什么?SHA-256?更高?我猜md5不合适?
我最近开始研究MD5哈希(用Java),虽然我找到了帮助我实现这一目标的算法和方法,但我还是想知道它是如何工作的.
首先,我从以下网址找到以下内容:
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while(two_halfs++ < 1);
}
return buf.toString();
}
Run Code Online (Sandbox Code Playgroud)
我没有发现任何需要在Java中使用位移,所以我有点生疏.有人足以说明(简单来说)上述代码究竟是如何进行转换的?">>>"?
我还在StackOverflow上找到了其他解决方案,例如这里和这里,它使用了BigInteger:
try {
String …Run Code Online (Sandbox Code Playgroud)