为什么InputStream.inAvailable()总是返回0?

时间:2013-06-27 13:03:34

标签: android sockets inputstream

我正在创建一个Android应用程序并将xml发送到ip地址。我应该回复一个xml作为响应,但输入流缓冲区中的字节总是为空。我使用以下代码:

 String sMessage = "<Server><CONNECT><IP>192.168.1.14</IP><Client_ID>123</CLIENT_GUID></CONNECT></Server>";

 Socket clientSocket = null;
 clientSocket = new Socket("192.168.252.148",34543);
 PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(),true);

 pw.write(sMessage);
 InputStream in = clientSocket.getInputStream();
 byte[] buffer = new byte[in.available()];
 System.out.println("buffer size: "+buffer.length);

 pw.close();
 in.close();
 clientSocket.close();

知道为什么我的输入流中没有字节。提前谢谢。

3 个答案:

答案 0 :(得分:1)

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()

  

available的{​​{1}}方法始终返回0.

     

这个方法应该被子类覆盖。

尝试使用InputStream进行换行。

BufferedInputStream

答案 1 :(得分:0)

  

我应该返回一个xml作为响应但输入流缓冲区中的字节

可能是这样,但不是即时的,这是你的代码所假设的。如果有任何正确的available()使用,那么这不是其中之一。只是阻止阅读。

答案 2 :(得分:-1)

.available()不能用于进程间通信(包含序列),因为它只检查当前进程中是否有可用的数据(在输入缓冲区中)。

在串行通讯中,当您发送按摩然后立即拨打available()时,您将大部分收到​​0,因为串口尚未回复任何数据。

解决方案是在单独的线程中使用阻塞read()(使用interrupt()来结束它):

try this Thread interrupt not ending blocking call on input stream read

在某些流(例如BufferedInputStream,上有内部缓冲区)上,读取了一些字节kept in memory,因此您可以读取它们without blocking the program flow。在这种情况下,available()方法会告诉您缓冲区中保留了多少字节。

new BufferedOutputStream(clientSocket.getOutputStream()));
new BufferedInputStream (clientSocket.getInputStream())