Java URLConnection不';我看不懂整页

Java URLConnection不';我看不懂整页,java,android,Java,Android,在我的应用程序中,我需要下载一些网页。我是这样做的 URL url = new URL(myUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(5000000);//5 seconds to download conn.setConnectTimeout(5000000);//5 seconds to connect conn.setRequestMethod("

在我的应用程序中,我需要下载一些网页。我是这样做的

URL url = new URL(myUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000000);//5 seconds to download
conn.setConnectTimeout(5000000);//5 seconds to connect
conn.setRequestMethod("GET");
conn.setDoInput(true);

conn.connect();
int response = conn.getResponseCode();
is = conn.getInputStream();

String s = readIt(is, len);
System.out.println("got: " + s);
我的
readIt
功能是:

public String readIt(InputStream stream) throws IOException {
    int len = 10000;
    Reader reader;
    reader = new InputStreamReader(stream, "UTF-8");
    char[] buffer = new char[len];
    reader.read(buffer);
    return new String(buffer);
}
问题是它不能加载整个页面。例如,如果
myUrl
为“”,则输出为“”

如何下载整个页面

更新 第二个答案解决了我的问题。问题出在
readIt
函数中。您应该像这样读取
InputStream
中的响应:

static String convertStreamToString(java.io.InputStream is) {
   java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
   return s.hasNext() ? s.next() : "";
}

您需要在循环中读取,直到InputStream中没有更多的字节

    while (-1 != (len = in.read(buffer))) { //do stuff here}

您仅从输入流读取10000字节

用一个简单的方法让你的生活更轻松

public String readIt(InputStream stream) throws IOException {
     BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
     StringBuilder out = new StringBuilder();
     String newLine = System.getProperty("line.separator");
     String line;
     while ((line = reader.readLine()) != null) {
        out.append(line);
        out.append(newLine);
     }
    return out.toString();
}

您的代码中有许多错误:

  • 您正在读取固定大小的字符缓冲区

  • 您正在忽略
    read(char[])
    方法的结果。它返回实际读取的字符数。。。你需要使用它

  • 您假设
    read(char[])
    将读取所有数据。事实上,它只保证返回至少一个字符。。。或零表示您已到达流的末尾。当您通过网络连接进行访问时,您可能只会获取另一端已发送并在本地缓冲的数据

  • char[]
    创建字符串时,假设字符数组中的每个位置都包含流中的一个字符

  • 有多种方法可以正确执行此操作,这是一种方法:

    public String readIt(InputStream stream) throws IOException {
        Reader reader = new InputStreamReader(stream, "UTF-8");
        char[] buffer = new char[4096];
        StringBuilder builder = new StringBuilder();
        int len;
        while ((len = reader.read(buffer) > 0) {
            builder.append(buffer, 0, len);
        }
        return builder.toString();
    }
    

    另一种方法是使用
    readFully(Reader)
    方法查找现有的第三方库方法。

    可能会延长读取时间?@lonesome看起来我在这里找到了一个解决方案:
    developer.android.com
    中的@lonesome readInt工作起来很奇怪。如果我使用这个技巧阅读
    java.util.Scanner s=new java.util.Scanner(is).useDelimiter(“\\A”);返回s.hasNext()?s、 next():“”然后一切都很好,但响应小于10000字节,但可能是您是对的。在第二个问题中,我也得到了同样的结果,然后
    len
    是1000。通过Chrome开发工具快速检查,wikipedia主页大小为60.8KB,即60800字节,即>10000。但如果我将
    len
    设置为1000,响应将完全相同。我实际上需要下载的页面只有5KB,即使我将
    len
    设置为100000,我也无法下载。它总是停在同一个地方。谢谢你的解释。这个
    readIt
    函数我刚刚从这里复制粘贴:你的解决方案给了我一个
    ArrayIndexOutOfBounds
    异常,即使我将缓冲区大小设置为10000(我下载的页面只有5KB)。我认为最简单的解决方法是在我的更新部分