我们为什么要使用OutputStream.write(byte [] b,int off,int len)而不是OutputStream.write(byte [] b)?

时间:2017-08-02 06:11:42

标签: java-io fileoutputstream

对不起,大家好。这是一个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()"的参数方法?

似乎两个代码都运行良好。

2 个答案:

答案 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字符。