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)。我认为最简单的解决方法是在我的更新部分