首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android - BufferedOutputStream不能刷新

Android - BufferedOutputStream不能刷新
EN

Stack Overflow用户
提问于 2012-05-25 16:03:52
回答 1查看 2.1K关注 0票数 1

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

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

代码语言:javascript
复制
        int lu = inFile.read();
        while(lu != -1){
            out.write(lu);
            lu = inFile.read();
        }
        out.flush();
        inFile.close();

inFile是我的流,用于使用套接字的OutputStream读出kml文件是我的BufferedOutputStream

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

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

我还尝试使用mySocket.shutdownOutput();

代码语言:javascript
复制
        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无法打开新输出流的情况下刷新缓冲区呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-25 18:18:22

Socket.close()Socket.shutdownOutput()都向对等体发送了一个EOS,他应该在上面关闭套接字,然后您就不能再写套接字了,因为您已经在那个方向上关闭了套接字。

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

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

  1. 在每条消息之前发送一个长度字。
  2. 在每条消息之后发送带外分隔符,即消息中不会出现的字节或字节序列。带有转义的STX/ETX协议就是一个例子。
  3. 使用自描述消息格式,如对象序列化或XML。STX/ETX也是一个例子。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10750733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档