gpt4 book ai didi

java - 使用 HttpURLConnection 下载速度较慢

转载 作者:行者123 更新时间:2023-12-01 12:59:08 25 4
gpt4 key购买 nike

我正在尝试制作一种下载网页的方法。首先,我创建一个 HttpURLConnection。其次,我调用 connect() 方法。第三,我通过 BufferedReader 读取数据。

问题是,对于某些页面,我的阅读时间还算合理,但对于某些页面,速度非常慢(可能需要大约 10 分钟!)。慢速页面总是相同的,并且它们来自同一个网站。使用浏览器打开这些页面只需几秒钟,而不是 10 分钟。这是代码

static private String getWebPage(PageNode pagenode)
{
String result;
String inputLine;
URI url;
int cicliLettura=0;
long startTime=0, endTime, openConnTime=0,connTime=0, readTime=0;
try
{
if(Core.logGetWebPage())
startTime=System.nanoTime();
result="";
url=pagenode.getUri();
if(Core.logGetWebPage())
openConnTime=System.nanoTime();
HttpURLConnection yc = (HttpURLConnection) url.toURL().openConnection();
if(url.toURL().getProtocol().equalsIgnoreCase("https"))
yc=(HttpsURLConnection)yc;
yc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)");
yc.connect();
if(Core.logGetWebPage())
connTime=System.nanoTime();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));

while ((inputLine = in.readLine()) != null)
{
result=result+inputLine+"\n";
cicliLettura++;
}
if(Core.logGetWebPage())
readTime=System.nanoTime();
in.close();
yc.disconnect();
if(Core.logGetWebPage())
{
endTime=System.nanoTime();
System.out.println(/*result+*/"getWebPage eseguito in "+(endTime-startTime)/1000000+" ms. Size: "+result.length()+" Response Code="+yc.getResponseCode()+" Protocollo="+url.toURL().getProtocol()+" openConnTime: "+(openConnTime-startTime)/1000000+" connTime:"+(connTime-openConnTime)/1000000+" readTime:"+(readTime-connTime)/1000000+" cicliLettura="+cicliLettura);
}
return result;
}catch(IOException e){
System.out.println("Eccezione: "+e.toString());
e.printStackTrace();
return null;
}
}

这里有两个日志样本“正常”页面之一getWebPage 执行大小:48261 响应代码=200 协议(protocol)=http openConnTime:0 connTime:1 readTime:569 cicliLettura=359

“慢”页面之一http://ricette.giallozafferano.it/Pan-di-spagna-al-cacao.html/allcomments看起来像这样getWebPage 执行大小:1748261 响应代码=200 协议(protocol)=http openConnTime:0 connTime:1 readTime:596834 cicliLettura=35685

最佳答案

您在这里看到的可能是您整理结果方式的结果。请记住,Java 中的 String 是不可变的 - 因此,当发生字符串连接时,必须实例化一个新的 String,这通常涉及复制该 中包含的所有数据>字符串。您为每一行执行以下代码:

result=result+inputLine+"\n";

在幕后,这一行涉及:

  1. 使用迄今为止结果的全部内容创建一个新的 StringBuffer
  2. inputLine 附加到 StringBuffer
  3. StringBuffer 转换为 String
  4. 为该String创建一个新的StringBuffer
  5. 一个换行符被附加到该StringBuffer
  6. StringBuffer 转换为 String
  7. 字符串存储为结果

随着结果变得越来越大,此操作将变得越来越耗时 - 并且您的结果似乎表明(尽管是来自 2 个样本!)结果随着页面大小而急剧增加.

而是直接使用StringBuffer

StringBuffer buffer = new StringBuffer();
while ((inputLine = in.readLine()) != null)
{
buffer.append(inputLine).append('\n');
cicliLettura++;
}
String result = buffer.toString();

关于java - 使用 HttpURLConnection 下载速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23658953/

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