我有一个套接字连接到我在其他地方托管的应用程序。连接后,我就创建了OutputStream
和DataInputStream
。
建立连接后,我将使用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/