我有一个套接字连接到我在其他地方托管的应用程序。连接后,我就创建了OutputStreamDataInputStream

建立连接后,我将使用OutputStream将握手数据包发送到应用程序。一旦握手被批准,它将通过DataInputStream(1)返回一个数据包。

该数据包经过处理,并使用OutputStream返回给应用程序。

如果此返回的数据有效,我将从DataInputStream(2)中获得另一个数据包。但是,我无法通过DataInputStream读取此数据包。

我尝试使用DataInputStream.markSupported()DataInputStream.mark(),但这没有给我任何东西(空的Exception消息除外)。

是否可以第二次读取输入流?如果是这样,有人可以指出我在这里做错了什么吗?

编辑:这是我的解决方案:

// First define the Output and Input streams.
OutputStream output = socket.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());

// Send the first packet to the application.
output.write("test"); // (not actual data that I sent)

// Make an empty byte array and fill it with the first response from the application.
byte[] incoming = new byte[200];
bis.read(incoming); //First packet receive

//Send a second packet to the application.
output.write("test2"); // (not actual data that I sent)

// Mark the Input stream to the length of the first response and reset the stream.
bis.mark(incoming.length);
bis.reset();

// Create a second empty byte array and fill it with the second response from the application.
byte[] incoming2 = new byte[200];
bis.read(incoming2);

我不确定这是否是最正确的方法,但是这种方法对我有用。

最佳答案

我将使用ByteArrayInput流或可以重置的东西。那将涉及将数据读入另一种类型的输入流,然后创建一个。

InputStream有一个markSupported()方法,您可以检查原始格式和字节数组,以找到该标记可使用的方法:

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#markSupported()
https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html

关于java - 如何读取DataInputStream两次或两次以上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35270854/

10-10 11:17