[英]Android/Java - How check when the OutputStream has finished to write the bytes
我创建了一个服务器套接字,该套接字接受来自客户端的连接,建立连接后,将使用写入字节的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是否已完成写入字节,因为有时并非所有图像都已正确传输
不,您的问题是您假设read()
填充了缓冲区。 写入返回时, OutputStream
已完成写入。 记住这一点:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
这是在Java中复制流的正确方法。 你不是。
您还假设文件大小适合一个int,
并且整个文件适合内存,并且浪费时间和空间将整个文件(也许)读入内存,然后再进行任何写操作。 上面的代码适用于1字节以上的任何大小的缓冲区。 我通常使用8192字节。
常见的解决方案是为数据添加描述所发送数据长度的多个字节(例如四个字节)作为前缀。
接收服务器读取前四个字节,计算长度,并知道何时完成读取文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.