Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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
Android/Java—如何检查OutputStream何时完成写入字节_Java_Android_Serversocket_Outputstream - Fatal编程技术网

Android/Java—如何检查OutputStream何时完成写入字节

Android/Java—如何检查OutputStream何时完成写入字节,java,android,serversocket,outputstream,Java,Android,Serversocket,Outputstream,我已经创建了一个服务器套接字,它接受来自客户机的连接,当连接建立时,将使用写入字节的OutputStream向其传输一个映像。我的问题是如何在关闭套接字连接之前检查OutputStream是否已完成写入字节,因为有时并非所有图像都正确传输。这是我正在使用的代码: File photoFile = new File(getHeader); //getHeader is the file that i have to transfer int size2 = (int) photoFile.leng

我已经创建了一个服务器套接字,它接受来自客户机的连接,当连接建立时,将使用写入字节的OutputStream向其传输一个映像。我的问题是如何在关闭套接字连接之前检查OutputStream是否已完成写入字节,因为有时并非所有图像都正确传输。这是我正在使用的代码:

File photoFile = new File(getHeader); //getHeader is the file that i have to transfer
int size2 = (int) photoFile.length();
byte[] bytes2 = new byte[size2];
try {
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(photoFile)); 
    buf.read(bytes2, 0, bytes2.length);
    buf.close();
    } catch (FileNotFoundException e) {
         e.printStackTrace();
    } catch (IOException e) {
         e.printStackTrace();
    }
    client.getOutputStream().write(bytes2, 0, size2); //client is the server socket

多亏了

一个常见的解决方案是在数据前面加上一个字节,比如四个字节,用来描述所发送数据的长度


接收服务器读取前四个字节,计算长度,并知道何时完成文件的读取。

一个常见的解决方案是在数据前面加上一些字节,比如四个字节,用来描述发送数据的长度

接收服务器读取前四个字节,计算长度,并知道何时完成文件读取

我的问题是,在关闭套接字连接之前,如何检查OutputStream是否已完成写入字节,因为有时并非所有图像都已正确传输

不,您的问题是您假设读操作填充了缓冲区。当写入返回时,OutputStream已完成写入。记住这一点:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
这是在Java中复制流的正确方法。你的不是

您还假设文件大小适合于int,并且整个文件适合于内存,并且在写入任何内容之前读取整个文件可能会浪费时间和空间。上述代码适用于1字节以上的任何大小的缓冲区。我通常使用8192字节

我的问题是,在关闭套接字连接之前,如何检查OutputStream是否已完成写入字节,因为有时并非所有图像都已正确传输

不,您的问题是您假设读操作填充了缓冲区。当写入返回时,OutputStream已完成写入。记住这一点:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
这是在Java中复制流的正确方法。你的不是


您还假设文件大小适合于int,并且整个文件适合于内存,并且在写入任何内容之前读取整个文件可能会浪费时间和空间。上述代码适用于1字节以上的任何大小的缓冲区。我通常使用8192字节。

谢谢您的回答,非常感谢您的帮助。因此,据我所知,我必须创建一个count变量,并将in.readbuffer的值赋给它。我有点困惑。。。in.read是什么意思?in是您正在读取的输入流。out是您正在写入的输出流。令人困惑,不是吗?我已经按照你的建议修改了代码。现在它真的更好用了,谢谢。只有一件事我不明白。。。当图像正确传输时,它在浏览器中看起来非常完美,但事实上outputStream并没有释放,而且浏览器似乎始终处于锁定状态。我已经添加了outputStream.close;但在这种情况下,输出流是在之前释放的,并且并不总是正确地传输和显示图像。例如,有时它只显示一个片段。有什么想法吗?谢谢我不知道“输出流未发布”是什么意思。如果这是你的意思,那么当上述循环结束时,你确实需要关闭它。谢谢你的回答,谢谢你的帮助。因此,据我所知,我必须创建一个count变量,并将in.readbuffer的值赋给它。我有点困惑。。。in.read是什么意思?in是您正在读取的输入流。out是您正在写入的输出流。令人困惑,不是吗?我已经按照你的建议修改了代码。现在它真的更好用了,谢谢。只有一件事我不明白。。。当图像正确传输时,它在浏览器中看起来非常完美,但事实上outputStream并没有释放,而且浏览器似乎始终处于锁定状态。我已经添加了outputStream.close;但在这种情况下,输出流是在之前释放的,并且并不总是正确地传输和显示图像。例如,有时它只显示一个片段。有什么想法吗?谢谢我不知道“输出流未发布”是什么意思。当上面的循环结束时,如果这是你的意思,你确实需要关闭它。