Java.net Что происходит быстрее всего, когда вы анализируете html из Интернета? - PullRequest
0 голосов
/ 06 ноября 2011

Используя java.net, java.io, какой самый быстрый способ отделить html от сети и загрузить его в файл или консоль?Является ли буферизованный писатель / буферизованный считыватель быстрее, чем Inputtreamreader / outputtreamwriter?Являются ли писатели и читатели быстрее, чем выходные и входные потоки?
Я испытываю серьезную задержку со следующей записывающей / потоковой записью:

URLConnection ii;
BufferedReader iik = new BufferedReader(new InputStreamReader(ii.getInputStream()));

String op;

while(iik.readLine()!=null) {
    op=iik.readLine();
    System.out.println(op);
}   

Но, что любопытно, я испытываю почти полное отсутствие задержки со следующим кодом:

URLConnection ii=i.openConnection();
Reader xh=new InputStreamReader(ii.getInputStream());

int r;
Writer xy=new PrintWriter(System.out);

while((r=xh.read())!=-1) {
    xy.write(r);
}  

xh.close();
xy.close();

Что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 06 ноября 2011

Ваш первый фрагмент неверен: он читает следующую строку, проверяет, является ли он нулевым, игнорирует его, затем читает следующую строку без проверки, является ли он нулевым, и печатает его.

Второй код печатает целочисленное значение каждого символа, считанного из считывателя.

Оба фрагмента используют одни и те же базовые потоки и считыватели, и, если они правильно закодированы, первый, вероятно, должен быть немного быстрее благодаря буферизации. Но, конечно, у вас будет что-то напечатанное на экране только после окончания строки. Если сервер отправляет одну строку текста размером 10 МБ, вам придется прочитать все 10 МБ, прежде чем что-то будет выведено на экран.

Обязательно закройте читатели в блоках finally.

3 голосов
/ 06 ноября 2011

Устройства чтения / записи не должны быть по своей природе быстрее, чем Input / OutputStreams.

Тем не менее, прохождение через readLine() и println(), вероятно, не является оптимальным способом передачи байтов. В вашем случае, если загружаемый файл не содержит много символов новой строки, BufferedReader придется буферизовать много данных, прежде чем readLine () вернет.

Канонический, не страшный способ передачи данных между потоками - это делать их порциями, используя буфер:

byte[] buf = new byte[1<<12];
InputStream in = urlConnection.getInputStream();
int read = -1;

while ((read = in.read(buf) != -1) {
    System.out.write(buf, 0, read);
}

Возможно, еще быстрее использовать NIO, код для него немного менее прост, и я просто использую код, найденный в этом сообщении в блоге .

Если вы пишете в / из файла, лучшим способом является использование подхода с нулевым копированием, который Java делает доступным с FileChannel.transferFrom() и transferTo(). Пример кода доступен в статье DeveloperWorks .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...