2016-11-30 70 views
0

数据,我有以下的代码,我使用的文件发送到客户端:Java的插座 - 重复去年写

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循环条件。我期望传输非常大的文件,所以我不想一次加载一个文件。

编辑:

我一直使用命令行两种telnetnetcat测试下载。

+0

您需要检查r来自读取和写入的eturn值。读取的值告诉您读了多少,并且可以安全地写入。来自写入的值告诉您写了多少内容,并可能提示重试。 –

回答

1

看到这个方法

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); 
    } 
+0

你的链接应该是'InputStream'的读取。根本原因是海报假定读取调用保证读取的字节数与第三个参数中传递的字节数相同。当然,事实并非如此。 – pvg

+0

我认为OP假定数组将被清除 –

+0

它可能不会被清除吗? –