我正在通过套接字发送文件,并尝试将其写入接收器的文件。
我见过这样做的例子:
int bytesRead = 0;
while (bytesRead != -1)
{
bytesRead = networkInputStream.read(buffer, 0, diskBlockSizeEstimate);
bufferedOutputStream.write(buffer, 0, bytesRead);
}
但是,从 http://developer.android.com/reference/java/io/InputStream.html#read%28byte[]%29 开始,当到达流的末尾时,它会像 .read 一样返回 -1。然后,当使用 -1 调用 .write 时,将引发异常。我是否必须实现"if(bytesRead==-1) set bytesToRead = fileSize - totalBytesRead"或类似这样的逻辑:
int fileSize = ... get filesize from sender ...;
int totalBytesRead = 0;
int bytesRead = 0;
while (bytesRead != -1)
{
bytesRead = networkInputStream.read(buffer, 0, diskBlockSizeEstimate);
if(bytesRead == -1)
{
bufferedOutputStream.write(buffer, 0, fileSize - totalBytesRead);
totalBytesRead += fileSize - totalBytesRead;
}
else
{
bufferedOutputStream.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
}
}
另外,做while(totalBytesRead != fileSize)而不是while(bytesRead != -1)会更好吗?
我这种事情的典型循环如下所示:
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
虽然我通常不喜欢在条件(循环或if
)中执行赋值,但对于这个特定用例来说,这是一种足够常见的模式,你很快就会习惯它。
请注意,此处的read
仅适用于整个缓冲区 - 我不确定为什么要将其限制为diskBlockSizeEstimate
...或者,如果您确实希望将其作为每次读取的最大量,只需创建具有该大小的缓冲区即可开始。