【问题标题】:How can DataInputStream reads from HttpURLConnection?DataInputStream 如何从 HttpURLConnection 读取数据?
【发布时间】:2016-06-10 14:04:19
【问题描述】:
           in = new DataInputStream(conn.getInputStream());
            String str = "";
            while (in.available() > 0) {
                str += in.readUTF();
            }

           in = new DataInputStream(conn.getInputStream());
            String str = "";
            while (in.available() > 0) {
                str2 += Bytes.toString(in.readBytes());
            }

我无法使用上述两种方法从我的 php 页面读取任何响应。

           in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String str2="";
                while ( (str  += in.readLine()) != null && in.ready()){} 

而且只有这种方法才行。

有人可以告诉我发生了什么输入流,类型或字符集的问题。谢谢!!

【问题讨论】:

  • 您确定要使用 DataInputStream 吗?这是一种非常特殊的二进制格式。您可以使用 InputStreamReader 读取文本,或使用 InputStream 读取原始字节。
  • in.available() 也可能不是您应该检查的。如果服务器响应尚未出现,那将返回 false。无需检查即可阅读。它将阻塞直到有足够的数据可用。
  • 这是否意味着 datainputstream 不适合通过 http 读取文本?谢谢!

标签: java android httpurlconnection


【解决方案1】:

readUTF() 只能读取由writeUTF() 写入的数据。除非您知道服务器正在以该格式发送数据,否则您不应该使用它。它不是通用的字符串读取方法。

您可能正在寻找BufferedReader.readLine(),但如果不知道您的应用程序有效负载协议,则无法确定。

while ( (str  += in.readLine()) != null && in.ready()){}

+= 是这里的错误操作。这使得下面的null 测试永远不可能是真的。使用=,并在循环内追加。 ready() 测试在这里也是徒劳的。您在这里测试的是(a)返回了一行,并且(b)一些进一步的数据正在等待等待读取而不会阻塞。你不关心(b)。删除它。您可能打算以相反的顺序编写测试,但这仍然是徒劳的。如果您不完全信任服务器,只需阻止 readLine(). 设置读取超时。

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2012-08-24
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多