Привет всем, учитывая строку 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 в память, используя как можно меньше времени?