我使用以下代码将文件发送到客户端:
private void sendFile(Socket client) throws Exception {
byte[] data = new byte[4096];
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
FileInputStream fis = new FileInputStream("test.txt");
while (fis.read(data, 0, data.length) != -1) {
dos.write(data);
}
fis.close();
dos.close();
}
我发现的问题是传输后文件大小不同。经过进一步调查,我发现文件在最后一个
dos.write(data)
中被复制。例:
原始文件:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Cras dictum diam neque, eu dictum sem efficitur ut.
Ut eu hendrerit risus.
In dapibus vel lectus at egestas.
传输文件:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Cras dictum diam neque, eu dictum sem efficitur ut.
Ut eu hendrerit risus.
In dapibus vel lectus at egestas.
Ut eu hendrerit risus.
In dapib
我到此为止,我已经看了数百个试图解决此问题的示例。我尝试了
dos.flush()
,将读取更改为dos.read(data)
,并更改了while
循环条件。我希望传输非常大的文件,所以我不想一次加载所有文件。编辑:
我一直在命令行中使用
telnet
和netcat
来测试下载。 最佳答案
看这个方法
https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#write(byte[],%20int,%20int)
和
https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read(byte[],%20int,%20int)
len-读取的最大字节数。
并返回
读入缓冲区的总字节数
您只想写入以前读取的字节数
所以
int br = -1;
while ((br = fis.read(data, 0, data.length)) != -1) {
dos.write(data, 0, br);
}