给定一个url String,如何尽可能快地将所有字节读入内存?

时间:2012-01-17 03:15:01

标签: java io

大家都给出了一个url字符串,我想尽可能快地将所有字节(最多指定数字 n )读入内存。

我想知道这个问题的最佳解决方案是什么?

我想出了两个解决方案,但是因为互联网连接永远不变,所以时间方法不可能看到哪个更节省时间,所以我想知道右边,这两个功能中的哪一个应该更节省时间? :

public static int GetBytes(String url, byte[] destination) throws Exception {
    //read all bytes (up to destination.length) into destination starting from offset 0
    java.io.InputStream input_stream = new java.net.URL(url).openStream();
    int total_bytes_read = 0;
    int ubound = destination.length - 1;
    while (true) {
        int data = input_stream.read();
        if (data == -1) {
            break;
        }
        destination[total_bytes_read] =(byte) data;
        if (total_bytes_read == ubound) {
            break;
        }
        ++total_bytes_read;
    }
    input_stream.close();
    return total_bytes_read;
}

public static int GetBytes2(String url, byte[] destination) throws Exception {
    //read all bytes (up to destination.length) into destination starting from offset 0
    java.io.InputStream input_stream = new java.net.URL(url).openStream();
    int total_bytes_read = 0;
    while (true) {
        int bytes_to_read = destination.length - total_bytes_read;
        if (bytes_to_read == 0) {
            break;
        }
        int bytes_read = input_stream.read(destination, total_bytes_read, bytes_to_read);
        if (bytes_read == -1) {
            break;
        }
        total_bytes_read += bytes_read;
    }
    input_stream.close();
    return total_bytes_read;
}

测试代码:

public final class Test {

    public static void main(String args[]) throws Exception {
        String url = "http://en.wikipedia.org/wiki/August_2010_in_sports"; // a really huuge page
        byte[] destination = new byte[3000000];
        long a = System.nanoTime();
        int bytes_read = GetBytes(url, destination);
        long b = System.nanoTime();
        System.out.println((b - a) / 1000000d);
    }
}

我从测试代码中获得的结果是:

GetBytes:

12550.803514
12579.65927
12630.308032
12376.435205
12903.350407
12637.59136
12671.536975
12503.170865

GetBytes2:

12866.636589
12372.011314
12505.079466
12514.486199
12380.704728
19126.36572
12294.946634
12613.454368

基本上,我想知道是否有人知道使用尽可能少的时间将所有字节从url读入内存的更好方法?

2 个答案:

答案 0 :(得分:1)

您一次读取的字节越多,读取的速度就越快。每次read()调用都会轮询您的输入设备并在重复执行时产生大量开销。 GetBytes2()比GetBytes()快。线程化也可能会提高您的读取速度,但最佳解决方案是优化您的算法。

答案 1 :(得分:1)

我建议你使用JSOUP java HTML解析器。我使用JSOUP PARSER使用您的代码尝试了您的给定URL。所花费的时间大约是所用时间的1/4。

      long a = System.nanoTime();
      Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/August_2010_in_sports").get();
      String title = doc.title();
   // System.out.println(doc.html());  // will print whole html code
      System.out.println(title);
      long b = System.nanoTime();
      System.out.println( "Time Taken  "  +    (b - a) / 1000000d);

输出:

August 2010 in sports - Wikipedia, the free encyclopedia
Time Taken  3842.634244

试试这个。您需要下载JAR files才能使用JSOUP。