Java 如何读取DataInputStream两次或两次以上?
我有一个到我在别处托管的应用程序的套接字连接。连接后,我创建了一个Java 如何读取DataInputStream两次或两次以上?,java,android,sockets,datainputstream,Java,Android,Sockets,Datainputstream,我有一个到我在别处托管的应用程序的套接字连接。连接后,我创建了一个OutputStream和DataInputStream 连接完成后,我使用OutputStream向应用程序发送握手数据包。一旦此握手获得批准,它将通过数据输入流返回一个数据包(1) 处理此数据包并使用OutputStream返回应用程序 如果返回的数据有效,我将从DataInputStream(2)获取另一个数据包。但是,我无法通过DataInputStream读取此数据包 我曾尝试使用DataInputStream.mark
OutputStream
和DataInputStream
连接完成后,我使用OutputStream
向应用程序发送握手数据包。一旦此握手获得批准,它将通过数据输入流返回一个数据包(1)
处理此数据包并使用OutputStream
返回应用程序
如果返回的数据有效,我将从DataInputStream
(2)获取另一个数据包。但是,我无法通过DataInputStream
读取此数据包
我曾尝试使用DataInputStream.markSupported()
和DataInputStream.mark()
,但这没有给我任何帮助(除了一条空的异常消息)
是否可以再次读取输入流?如果是这样,有人能告诉我我做错了什么吗
编辑:以下是我的解决方案:
//首先定义输出和输入流。
OutputStream输出=socket.getOutputStream();
BufferedInputStream bis=新的BufferedInputStream(socket.getInputStream());
//将第一个数据包发送到应用程序。
输出。写入(“测试”);//(不是我发送的实际数据)
//创建一个空字节数组,并用应用程序的第一个响应填充它。
字节[]传入=新字节[200];
二读(传入)//第一包接收
//向应用程序发送第二个数据包。
output.write(“test2”);//(不是我发送的实际数据)
//将输入流标记为第一个响应的长度并重置流。
双标记(输入长度);
二、重置();
//创建第二个空字节数组,并用应用程序的第二个响应填充它。
字节[]incoming2=新字节[200];
二读(收入2);
我不确定这是否是最正确的方法,但这种方法对我有效。我会使用ByteArrayInput流或其他可以重置的方法。这将涉及将数据读入另一种类型的输入流,然后创建一个输入流
InputStream有一个markSupported()
方法,您可以检查原始数组和字节数组,以找到标记将使用的方法:
这里的问题不是重新读取输入。我在问题中没有看到任何需要你阅读两次输入的内容。问题是BufferedInputStream,
将读取所有可读取的内容,包括第二条消息(如果已经到达)
解决方案是在完成握手之前不使用缓冲流。只需在套接字输入流上读取第一条消息的确切长度,进行握手,然后继续构造和读取缓冲流。请看一个更好的解决方案,就是记住需要记住的任何内容,并且只读取一次。这是我的问题。我不是一读就明白的。在我从OutputStream
@marcoferari提交了一个数据包后,我从应用程序中得到了第二个(和第三个)响应。我已经添加了一个工作示例并进行了解释。我将如何继续这样做?据我所知,我需要读取带有InputStream
的行,并将结果放入ByteArrayInputStream
。但是,markSupported()
无效,而且我似乎无法再次阅读InputStream
。根据您的回答,我现在似乎可以正常工作了。但是,我没有使用ByteArrayInputStream
。我还使用了常规的标记
,并计算了我的字节数。我已经将DataInputStream
替换为BufferedInputStream
。最后一段代码是我自己提出的解决方案(但正如我所说,这可能不是最好的方法)。问题是,在通过OutputStream
发送一些数据后,我第二次无法读取BufferedInputStream
。但是,使用mark()
和reset()
可以解决这个问题。