gpt4 book ai didi

java - URLConnection 不读取整个页面

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:31 25 4
gpt4 key购买 nike

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

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 是“https://wikipedia.org”,那么输出是 enter image description here

如何下​​载整个页面?

更新来自这里的第二个答案 Read/convert an InputStream to a String解决了我的问题。问题出在 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() : "";
}

最佳答案

你的代码有很多错误:

  1. 您正在读入一个固定大小的字符缓冲区。

  2. 您忽略了 read(char[]) 方法的结果。它返回实际读取的字符数……您需要使用它。

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

  4. 当您从 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) 方法查找现有的第 3 方库方法。

关于java - URLConnection 不读取整个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34311971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com