Android - BufferedOutputStream不会刷新

时间:2012-05-25 08:03:52

标签: java android networking flush bufferedoutputstream

我遇到了BufferedOutputStream的问题。我想通过套接字连接将Android设备中的kml文件发送到java服务器。 (连接正常,我已经能够在程序的其他部分与PrintWriter交换数据)

要发送我的kml文件,我填充缓冲区。但是当我冲洗它时,没有任何事情发生。

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

inFile是我用来读取kml文件的流 out是我的BufferedOutputStream,使用socket的OutputStream

我不关闭我的对象,但我不想,我不会只使用它一次。这就是问题...... 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输出是关闭的

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

1 个答案:

答案 0 :(得分:3)

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

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

您正在搜索的是一种划分应用程序协议消息的方法。至少有三种技术:

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