Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从InputStream复制到BufferedOutput流_Java_Android_Inputstream - Fatal编程技术网

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时,没有实际读取的字节-我知道了。谢谢如果要复制内存块,则不需要缓冲流。缓冲用于将较小的读/写转换为较大的读/写。如果要复制内存块,则不需要缓冲流。缓冲用于将较小的读/写转换为较大的读/写。