二进制文件传输Ok Win7到Linux,而不是Linux到Win7

时间:2012-04-06 18:08:32

标签: java sockets file-upload md5 binaryfiles

我有一些客户端服务器套接字代码,并且正在Windows 7机器和SUSE Linux机器之间传输二进制文件。当我将文件从Win7传输到Linux时,它们最终得到相同的MD5校验和,所以我知道它们是相同的。但是当我从Linux转移到Win7时,校验和不一致,表明文件没有正确传输。

有人碰到这个吗?我正在使用ObjectOutputStreams和DataInputStreams,两边的代码都是一样的。

 // connect socket to server socket, etc
//........

//=======================
// read the file
try {
size = file.length();
byteArr = new byte[(int) size];
dis = new DataInputStream(new FileInputStream(file));
dis.read(byteArr, 0, byteArr.length);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

//=======================
// then send it
try {
oos.writeObject(byteArr);
oos.flush();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

// then close oos, dis, etc

1 个答案:

答案 0 :(得分:0)

InputStream.read无法保证填充输入数组。它保证至少读取1个字节且不超过数组,或者如果到达文件末尾则为0个字节,或者IOException。可能是在Linux下你不能一次性获取整个文件。

另外,为什么要填充字节数组然后将其作为对象发送?流被概念化为字节流,不需要数组。

例如

int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];

FileInputStream input = new FileInputStream(file);

int read;
while ((read = input.read(buffer)) != -1) {
    output.write(buffer, 0, read);
}

// flush and close everything