Java 从InputStream复制到BufferedOutput流
我正在通过套接字发送一个文件,并试图在接收器将其写入一个文件 我见过这样的例子:Java 从InputStream复制到BufferedOutput流,java,android,inputstream,Java,Android,Inputstream,我正在通过套接字发送一个文件,并试图在接收器将其写入一个文件 我见过这样的例子: int bytesRead = 0; while (bytesRead != -1) { bytesRead = networkInputStream.read(buffer, 0, diskBlockSizeEstimate); bufferedOutputStream.write(buffer, 0, bytesRead); } int fileSize = ... get filesize
int bytesRead = 0;
while (bytesRead != -1)
{
bytesRead = networkInputStream.read(buffer, 0, diskBlockSizeEstimate);
bufferedOutputStream.write(buffer, 0, bytesRead);
}
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;
}
}
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.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 bytesRead = 0;
while (bytesRead != -1)
{
bytesRead = networkInputStream.read(buffer, 0, diskBlockSizeEstimate);
bufferedOutputStream.write(buffer, 0, bytesRead);
}
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;
}
}
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
另外,使用while(totalBytesRead!=fileSize)而不是while(bytesRead!=-1)是否更好?我对这类事情的典型循环如下所示:
int bytesRead = 0;
while (bytesRead != -1)
{
bytesRead = networkInputStream.read(buffer, 0, diskBlockSizeEstimate);
bufferedOutputStream.write(buffer, 0, bytesRead);
}
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;
}
}
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
虽然我通常不喜欢在条件内执行赋值(循环或如果
),但对于这个特定用例来说,这是一种非常常见的模式,您可以很快习惯它
请注意,此处的
读取
仅针对整个缓冲区-我不确定您为什么要将其限制为diskBlockSizeEstimate
。。。或者,如果您确实希望每次读取的数据量最大,只需创建具有该大小的缓冲区即可。我的典型循环如下所示:
int bytesRead = 0;
while (bytesRead != -1)
{
bytesRead = networkInputStream.read(buffer, 0, diskBlockSizeEstimate);
bufferedOutputStream.write(buffer, 0, bytesRead);
}
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;
}
}
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
虽然我通常不喜欢在条件内执行赋值(循环或如果
),但对于这个特定用例来说,这是一种非常常见的模式,您可以很快习惯它
请注意,此处的
读取
仅针对整个缓冲区-我不确定您为什么要将其限制为diskBlockSizeEstimate
。。。或者,如果您确实希望每次读取的数据量最大,只需创建一个具有该大小的缓冲区即可。但不会调用。上次通过循环写入(缓冲区,0,-1)吗?(这是非法的)。或者实际上,我猜它不会调用write(…,-1),因为循环在该条件下不会重新进入,但它永远不会将最后的字节写入输出?@DavidDoria:不会,不会-因为当分配的值为-1时,循环将退出而不是进入主体。抱歉,我触发太快了。我编辑了这条评论,问它是否永远不会在最后一次读取中写入字节?@DavidDoria:实际读取内容的最后一次读取将返回读取的字节数,而不是-1。啊,因此当返回-1时,没有实际读取的字节-我知道了。谢谢但是上次通过循环写入(缓冲区,0,-1)不是吗?(这是非法的)。或者实际上,我猜它不会调用write(…,-1),因为循环在该条件下不会重新进入,但它永远不会将最后的字节写入输出?@DavidDoria:不会,不会-因为当分配的值为-1时,循环将退出而不是进入主体。抱歉,我触发太快了。我编辑了这条评论,问它是否永远不会在最后一次读取中写入字节?@DavidDoria:实际读取内容的最后一次读取将返回读取的字节数,而不是-1。啊,因此当返回-1时,没有实际读取的字节-我知道了。谢谢如果要复制内存块,则不需要缓冲流。缓冲用于将较小的读/写转换为较大的读/写。如果要复制内存块,则不需要缓冲流。缓冲用于将较小的读/写转换为较大的读/写。