大家都给出了一个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读入内存的更好方法?
答案 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。