BufferedReader to BufferedWriter - PullRequest
       32

BufferedReader to BufferedWriter

2 голосов
/ 17 августа 2011

Как я могу получить BufferedWriter от BufferedReader?

Я бы хотел иметь возможность сделать что-то вроде этого:

BufferedReader read  = new BufferedReader(new InputStreamReader(...));
BufferedWriter write = new BufferedWriter(read);

Ответы [ 5 ]

10 голосов
/ 17 августа 2011

Вы можете использовать следующее из Apache commons io:

IOUtils.copy(reader, writer);

site here

1 голос
/ 17 мая 2018

Обновления JAVA 9

Начиная с Java 9, Reader предоставляет метод с именем TransferTo со следующей подписью:

public long transferTo(Writer out)  throws IOException

Как указано в документации, TransferTo будет:

Считывает все символы из этого устройства чтения и записывает символы для данного устройства записи в порядке их чтения.По возвращении этот читатель будет в конце потока.Этот метод не закрывает ни читателя, ни писателя.Этот метод может блокировать бесконечно чтение из читателя или запись в писатель.Поведение для случая, когда считыватель и / или записывающее устройство асинхронно закрыты или поток, прерванный во время передачи, сильно зависит от читателя и записывающего устройства и поэтому не указывается.

Если при чтении возникает ошибка ввода-выводаот читателя или пишущего писателю, он может сделать это после того, как некоторые символы были прочитаны или написаны.Следовательно, считыватель может не находиться в конце потока, и один или оба потока могут находиться в несогласованном состоянии.Настоятельно рекомендуется, чтобы оба потока были незамедлительно закрыты при возникновении ошибки ввода-вывода.

Поэтому, чтобы записать содержимое Java Reader на Writer, вы можете написать:

reader.transferTo(writer);
1 голос
/ 17 августа 2011

Если вы хотите знать, что происходит:

Все входные данные со считывателя копируются в поток ввода

Что-то похожее тоже:

 private final void copyInputStream( InputStreamReader in, OutputStreamWriter out )      throws IOException
  {
    char[] buffer=new char[1024];
    int len;
    while ( ( len=in.read(buffer) ) >= 0 )
      {
      out.write(buffer, 0, len);
      }
  }

Больше на входе ивывод на Действительно большой индекс

0 голосов
/ 06 января 2012

Вы можете использовать Piped Read / Writers ( ссылка ). Это именно то, для чего они предназначены. Не уверен, что вы сможете повторно скопировать их в существующий буферизованный ридер, который вы передали ". Вам бы пришлось сознательно построить читатель buf вокруг него.

0 голосов
/ 17 августа 2011

Конструктор BufferedWriter не перегружен для принятия читателей, верно? то, что сказал Буб, было правильным.

BufferedWriter  writer = new BufferedWriter(
new FileWriter("filename_towrite"));    

IOUtils.copy(new InputStreamReader(new FileInputStream("filename_toread")), writer);
writer.flush();
writer.close();
...