Можно ли получить содержимое BufferedWriter в виде строки? - PullRequest
0 голосов
/ 27 ноября 2018

Итак, у нас есть операции, которые записывают в файл на сервере с помощью BufferedWriter.Перед тем как этот BufferedWriter будет сброшен, я хочу загрузить содержимое в корзину S3.В настоящее время (и неуместно) я собираю каждую строку, которую BufferedWriter пишет, используя StringBuilder (добавляя каждый раз), но это огромная строка (~ 150 МБ).Поэтому было бы предпочтительнее просто написать то, что хранится непосредственно в BufferedWriter.Я обыскивал Интернет и ТАК, но не могу найти однозначного ответа на этот вопрос.

Возможно ли это с очень небольшим кодом?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Вы используете BufferedWriter в качестве кеша для кеширования всего потока, а затем записываете его в двух местах.

Я использую класс MemFile, который немного более эффективно сохраняет поток в памятичем StringBuilder или ByteArrayOutputStream, потому что он не должен выделять память в одном непрерывном блоке.

Этот класс доступен с открытым исходным кодом по адресу: https://github.com/agilepro/mendocino/blob/master/src/com/purplehillsbooks/streams/MemFile.java

Эти методы существуют:

java.io.Reader  getReader();
java.io.Writer  getWriter();
void            outToWriter(java.io.Writer w);

Создайте экземпляр класса, получите Writer, напишите в него.Как только он заполнится содержимым, используйте outToWriter для потоковой передачи сначала на S3, а затем в файл, используя другой Writer.Или используйте Reader, если это удобнее.

Проблема упоминала писателей, которые ориентированы на символы, но также существуют и методы потока байтов, если вы действительно хотите работать с байтами.

Документация находится по адресу: http://purplehillsbooks.com/purpleDoc/

0 голосов
/ 27 ноября 2018

Возможно ли получить содержимое BufferedWriter как String?

Нет, это невозможно сделать.

BufferedWriter содержит только «один буфер заполнен» записанных данных.Этого недостаточно для того, что вам нужно.Остальные данные будут записаны в файл и больше не будут доступны в памяти.(И, кроме того, буфер писателя намеренно скрыт за слоем абстракции, поэтому вы не можете получить его ... без "мерзкого" отражения.)

Теперь вы можете добавить дополнительный компонент или компонентыв стек вывода, чтобы захватить вывод в памяти.Например, вы можете использовать класс Apache TeeOutputStream ( javadoc ), чтобы разделить данные и записать 2-ю копию в ByteArrayOutputStream.Или вы можете записать 2-ю копию непосредственно в выходной поток S3.

Другой способ сделать это - «погрузить» данные, которые вы хотите записать в ByteArrayOutputStream, извлечь массив байтов и записать его один раз.в файл и во второй раз в поток в корзину S3.

Если размер файла может быть большим, может быть лучше избегать всего, что влечет за собой хранение всего содержимого файла в памяти.

0 голосов
/ 27 ноября 2018

A BufferedWriter - немного больше, чем обертка вокруг некоторого другого Writer.Таким образом, это будет зависеть от того, какой тип Writer был передан в его конструктор.

Типы Writer, которые поддерживают возможность чтения, включают CharArrayWriter и StringWriter, которые позволяют читать содержимое как char[] и String соответственно.

...