对不起,大家好。这是一个Java初学者问题,但我认为它对很多java学习者都有帮助。
FileInputStream fis = new FileInputStream(file);
OutputStream os = socket.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer)) != -1){
os.write(buffer, 0, len);
}
上面的代码是FileSenderClient类的一部分,它用于使用java.io和java.net.Socket从客户端向服务器发送文件。
我的问题是:在上面的代码中,我们为什么要使用
os.write(buffer, 0, len)
而不是
os.write(buffer)
以另一种方式提出这个问题:有一个" len" " OutputStream.write()"的参数方法?
似乎两个代码都运行良好。
答案 0 :(得分:2)
while((len=fis.read(buffer)) != -1){
os.write(buffer, 0, len);
}
因为您只想编写实际读取的数据。考虑输入由 N 缓冲区加一个字节组成的情况。如果没有len
参数,您将编写(N+1)*1024
个字节而不是N*1024+1
个字节。还要考虑从套接字读取的情况,或者实际上是读取的一般情况:InputStream.read()
的实际合同是它至少传输一个字节,不它填充缓冲区。由于某种原因,它通常不能。
似乎两个代码都运行良好。
不,他们不是。
答案 1 :(得分:-1)
它实际上不会以相同的方式工作。
您很可能使用非常小的文本文件进行测试。但是如果你仔细观察,你仍会发现你收到的文件末尾有很多额外的空格,你收到的文件大小比你发送的文件大。
原因是您创建了一个大小为1024的字节数组,但是您没有太多数据要放入(或读取())到该字节数组中。因此,字节数组在端部填充为NULL。在写入文件时,这些NULL仍然写入文件并显示为空格" "在Windows记事本中......
如果使用Notepad ++或Sublime Text等高级文本编辑器查看收到的文件,您将看到这些NULL字符。