2013-12-05 3 views
0

Я хочу преобразовать входной поток в массив байтов. Я знаю, что могу использовать IOUtils из сообщества. Но я практикую некоторые основы в java io. Я прочитал xml-файл с использованием BufferedReader и попытался записать его в ByteArrayOutputStream с помощью BufferedWriter. Но это не работает.BufferedWriter не пишет ByteArrayOutputStream

Когда я пишу непосредственно в ByteArrayOutputStream, он работает. Что не так в моем коде?

try (InputStream inputStream = getClass().getResourceAsStream(
       "/productInventory.xml"); 
       ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); 
       BufferedWriter bufferedWriter = new BufferedWriter(
         new OutputStreamWriter(arrayOutputStream)); 
       BufferedReader bufferedReader = new BufferedReader(
         new InputStreamReader(inputStream));) { 
      String line = ""; 
      while ((line = bufferedReader.readLine()) != null) { 

       bufferedWriter.write(line); 
      } 
      System.out.println(arrayOutputStream.size()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

Когда я включаю ниже линии в цикле его рабочего

arrayOutputStream.write(line.getBytes(), 0, line.getBytes().length); 

Что неправильно при использовании BufferedWriter?

ответ

5

Ничего страшного - это просто буферизация! : D

BufferedWriter работает, фильтруя все, что вы посылаете в него, в буфер - когда буфер заполнен или когда автор закрыт или покраснел (это закрывается, поэтому вы должны его полностью закрыть), он посылает эти буферизированные символы основному автору.

Если вы хотите, чтобы увидеть основное обновление писателя вы должны либо:

1) Заполнение буфера (размер по умолчанию 8k в Java)

2) Позвоните .flush()

3) Вызов .close()

4) Как уже упоминалось в комментариях, вы можете сделать попробовать-с ресурсами, чтобы сделать закрытие неявное:

try (BufferedWriter writer = new BufferedWriter(underlyingWriter)) { 
    // doStuff 
} 
+0

Или сделать последнее автоматически с помощью инструкции try-with-resources. –

+0

Я назвал flush(). Оно работало завораживающе. Размер моего файла - 6k. Вы сказали, что размер по умолчанию - 8k. Так что, если у меня есть файл из 10k, и я не называю flush(). Будет ли он писать первые 8k в ByteArrayOutputStream? –

+0

Нет, он выполнит две записи - одну запись 8k при заполнении буфера и вторую запись 2k, когда вы вызываете 'flush()' - (Или, 'close()', что является лучшей практикой) – torquestomp

Смежные вопросы