【问题标题】:Binary file transfer Ok Win7 to Linux, not Ok Linux to Win7二进制文件传输 Ok Win7 到 Linux,而不是 Ok Linux 到 Win7
【发布时间】:2012-04-06 18:08:32
【问题描述】:

我有一些客户端服务器套接字代码,并且正在 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

【问题讨论】:

  • 你不想尝试使用FileUtils 吗?
  • 我对 FileUtils 库一无所知。它有专门用于传输二进制文件的方法吗?

标签: java sockets file-upload md5 binaryfiles


【解决方案1】:

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

【讨论】:

  • 我确实忘记提到文件发送到 Win7 机器后的字节数与在 Linux 机器上的相同,所以它似乎像正在发送整个文件。此外,InputStream.read 可能不会填满输入数组,但 InputStream.read(byte[], 0, byte[].length) 应该填满整个数组,实际上确实如此。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多