Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取DataInputStream两次或两次以上?_Java_Android_Sockets_Datainputstream - Fatal编程技术网

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()
可以解决这个问题。