JAVA:BufferdInputStream和BufferedOutputStream

JAVA:BufferdInputStream和BufferedOutputStream,java,stream,inputstream,outputstream,Java,Stream,Inputstream,Outputstream,我有几个问题- 1。我有两台计算机通过套接字连接。当程序执行时 outputStream.writeInt(value); outputStream.flush(); 到底发生了什么?程序是否等待另一台计算机读取整数值 2.如何清空outputStream或inputStream?意思是,当清空的时候 outputStream或inputStream,将删除写入该流的内容。 (请不要建议通过关闭连接来执行此操作!) 我试图以这种方式清空inputStream- byte[] eatup=new

我有几个问题-

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

outputStream.writeInt(value);
outputStream.flush();
到底发生了什么?程序是否等待另一台计算机读取整数值

2.如何清空
outputStream
inputStream
?意思是,当清空的时候
outputStream
inputStream
,将删除写入该流的内容。 (请不要建议通过关闭连接来执行此操作!) 我试图以这种方式清空
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
错误

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

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

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


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

您不应该使用<代码>可用< /C> >来确定要读取多少个代码>字节< /C>>。可用的
的某些实现将始终返回
0
,然后您的代码将无法工作。只需尝试完全填充缓冲区并检查
read
的返回,以查看实际读取的
字节数。
while(serverInputStream.read(eatup,0,可用)!=-1)
@Jeffrey但是如果我在这方面使用
read
方法,当没有字节可读取时,程序将阻塞(文档中这样说),这是我不想要的。@Jisean-如果您需要在不关闭连接的情况下检测接收端的“消息结束”,那么您需要构建一个基本的消息协议。请参阅我的答案,以获取一个示例(大小前缀)@JisanMahmud你为什么试图丢弃
InputStream
上的现有数据?“定义协议”对我来说有点高,这只是我在“客户机-服务器文件共享”上的大学JAVA项目。谢谢你的信息,不过,清除了一些混乱!不客气。如果您只需要一些基本的东西,请使用DataInputStream和DataOutputStream,并将读操作与写操作相匹配。这将支持您需要的大多数东西。