2 BufferedReaders из одного InputStream - PullRequest
1 голос
/ 14 октября 2011

Я сделал следующий код:

try {
  URL url = new URL("http://bbc.com");
  is = url.openStream();
  BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  System.out.println(in.readLine());
  //in.close(); with this next lines throw java.io.IOException: stream is closed
  in = new BufferedReader(new InputStreamReader(is, "iso-8859-2"));
  System.out.println(in.readLine().length());
} catch (Exception ex) {
  ex.printStackTrace();
}

Проблема в том, что второй BufferedReader начинает считываться с нескольких точек после почти каждого запуска программы (длина печати отличается). Те же проблемы возникают при одинаковой кодировке. Как я могу прочитать кодировку, а затем прочитать контент с этой кодировкой, не создавая новый InputStream (каждое создание нового InputStream занимает от 0,1 до 3 с в зависимости от сайта)?

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Я предлагаю вам скопировать весь поток, например, неоднократно вызывая read(), а затем записывая результаты в ByteArrayOutputStream.После этого вы можете получить байтовый массив и создать несколько независимых ByteArrayInputStream оболочек вокруг байтового массива.

(Вы можете использовать ByteStreams.ToByteArray(is) в Guava в качестве альтернативы для первой части.)

Другой альтернативой было бы заключить оригинальную InputStream в BufferedInputStream, немедленно вызвать mark с «достаточно большим» пределом, а затем сбросить его после прочтения первой строки перед созданием второй * 1012.*.

1 голос
/ 14 октября 2011

Я бы не использовал BufferedReader для чтения первой строки, я бы просто читал символы, пока не найду '\ n'.

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