gpt4 book ai didi

java - Android - BufferedOutputStream 不刷新

转载 作者:行者123 更新时间:2023-11-29 05:59:20 26 4
gpt4 key购买 nike

我对 BufferedOutputStream 有疑问。我想通过套接字连接将 kml 文件从 Android 设备发送到 java 服务器。(连接正常,我已经可以在程序的其他部分与 PrintWriter 交换数据)

为了发送我的 kml 文件,我填充了缓冲区。但是当我 flush() 它时,什么也没有发生。

        int lu = inFile.read();
while(lu != -1){
out.write(lu);
lu = inFile.read();
}
out.flush();
inFile.close();

inFile是我用来读取kml文件的流out 是我的 BufferedOutputStream 使用我的套接字的 OutputStream

我没有关闭我的 out 对象,但我不想这样做,我不会只使用它一次。这就是问题所在......close() 方法发送缓冲区的数据但也关闭套接字。flush() 方法不发送缓冲区的数据。

我想在不关闭套接字的情况下刷新缓冲区。

我也试过使用 mySocket.shutdownOutput();

        int lu = inFile.read();
while(lu != -1){
out.write(lu);
lu = inFile.read();
}
out.flush();
mySocket.shutdownOutput();
inFile.close();

此方法关闭我的流并保持我的套接字打开,这就是我想要的。但是当我尝试打开一个新的输出流时,异常 java.net.SocketException: Socket output is shutdown

那么,如何在不关闭我的 sokcet 的情况下刷新我的缓冲区而无法打开新的输出流?

最佳答案

Socket.close()Socket.shutdownOutput() 都向对端发送一个 EOS,他应该关闭套接字,之后你不能不再写入套接字,因为您已经朝那个方向关闭了它。

因此,如果您需要继续写入套接字,则不能使用这两种方法中的任何一种。

您正在寻找的可能是一种分隔应用程序协议(protocol)消息的方法。至少有三种技术:

  1. 在每条消息之前发送一个 length word。
  2. 在每条消息后发送带外定界符,即消息中不能出现的字节或字节序列。带有转义符的 STX/ETX 协议(protocol)就是一个例子。
  3. 使用自描述消息格式,例如对象序列化或 XML。 STX/ETX 也是一个例子。

关于java - Android - BufferedOutputStream 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10750733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com