JAVA : BufferdInputStream and BufferedOutputStream

标签 java stream inputstream outputstream

我有几个问题-

1. 我有两台通过套接字连接连接的计算机。当程序执行时

outputStream.writeInt(value);
outputStream.flush();

到底发生了什么?程序是否会等到另一台计算机读取整数值?

2.如何清空outputStreaminputStream?意思是,当清空时 outputStreaminputStream,写入该流的任何内容都会被删除。 (请不要建议通过关闭连接来做到这一点!) 我尝试用这种方式清空inputStream-

byte[] eatup=new byte[20*1024];
int available=0;
while(true)
{
    available=serverInputStream.available();
    if(available==0)
       break;
    serverInputStream.read(eatup,0,available);
}
eatup=null;

String fileName=(String)serverInputStream.readObject();

程序不应处理该行,因为 outputStream 上没有写入任何其他内容。 但我的程序无论如何都会执行它并抛出 java.io.OptionalDataException 错误。

注意:我正在开发一个客户端-服务器文件传输项目。客户端将文件发送到 服务器。第二个代码用于服务器终端。如果在服务器上按下“取消按钮” end 然后它停止从 serverInputStream 读取字节并发送一个信号(我使用 int -1) 给客户。当客户端收到此信号时,它会停止向服务器发送数据,但我已经 注意到serverInputStream不为空。所以我需要清空这个serverInputStream以便 客户端计算机能够再次发送服务器计算机文件(这就是为什么我无法管理锁 来自 read 方法)

最佳答案

1 - 否。在flush() 上,数据将被写入操作系统内核,操作系统内核可能会立即将其交给网卡驱动程序,网卡驱动程序又将其发送到接收端。简而言之,发送即发即忘。

2 - 正如 Jeffrey 所评论的,available() 对于此类操作并不可靠。如果执行阻塞 IO,那么正如他建议的那样,您应该推测性地使用 read() 。然而应该说,您确实需要在原始流之上定义一个协议(protocol),即使它只是使用 DataInput/DataOutputStream。使用原始写入/读取时,黄金法则是一次写入!=一次读取。例如,如果您要在一侧写入 10 个字节,而在另一侧有一个读取循环,则不能保证一次读取会读取所有 10 个字节。它可以作为 block 的任意组合来“读取”。同样,在接收端,两次 10 字节的写入可能会显示为一次 20 字节的读取。换句话说,除非您在原始字节之上创建更高级别的协议(protocol)来处理数据包,否则不存在“数据包”的概念。例如,每次发送都以字节长度为前缀,以便接收方知道当前数据包中需要多少数据。

如果您确实需要做比基本应用程序更复杂的事情,我强烈建议您研究一些更高级别的库,它们已经解决了网络 IO 的许多棘手问题。我会推荐Netty我将其用于生产应用程序。然而,从简单的 IO 流到 Netty 的更多基于事件的系统,这在理解上是一个很大的飞跃。中间可能还有其他库。

关于JAVA : BufferdInputStream and BufferedOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238426/

相关文章:

java - 在运行 Jboss 时重新启动 JMS

java - 在字节流中添加数据的最有效方法是什么?

javascript - NodeJS 在读取 txt 时调用函数。文件已更新

c# - 如何将数字写入文件并使其在 Java 和 C# 之间可读

java - 来自应用程序引擎端点的 HttpRequest。连接重置

java - Guava CacheLoader 未命中

java - 如何用带点的格式化程序左填充整数?

java - 无法将值从 Bash 脚本传递到 Java 程序

javascript - Node.js Http 服务器,readstream 结束事件触发 console.log 两次

java - 是否可以在InputStream和OutputStream上创建1个以上的使用者?