2013-08-19 3 views
1

OutputStreamWriter обертывает OutputStream за интерфейсом Writer. Что, если я хочу обратный, я хочу, чтобы интерфейс OutputStream был в Writer? Например, я хочу сериализовать объект в StringWriter.Что является обратным для OutputStreamWriter

+0

'OutputStreamWriter' _writes_ для' OutputStream'. Писатель пишет. Вы не можете писать на него. Однако вы могли бы написать «BinaryOutputStream», получить байты и преобразовать их в «String», если это то, что вы имеете в виду. –

+0

Можете ли вы показать пример кода, чего вы хотите достичь? Непонятно, зачем вам это нужно. –

+1

@LewsTherin Почему WriterOutputStream не имеет смысла? Java API полон классов-оболочек, которые можно комбинировать по-разному. Не могли бы вы рассказать о своем вопросе? – Mishax

ответ

1

Семантика OutputStreamWriter состоит в том, чтобы взять текст и преобразовать его в соответствии с кодировкой символов в байтах. Это очень распространенный шаблон (байты низкого уровня интерпретируются как текст высокого уровня), поэтому неудивительно, что этот класс является частью стандартного Java API.

Вы хотите WriterOutputStream. Но вы забыли рассказать нам о семантике, которую вы ожидаете от такого класса. Я могу представить себе несколько вариантов использования для OutputStream обертывание Writer:

  • Преобразование байта в кодировке Base64 строки
  • Преобразование байта в таблицу гекса значений
  • Предполагая, что поток байтов в зашифрованный текст message: расшифровать байты и записать оригинальный незашифрованный текст.
  • Предполагая, что поток байтов является значением какого-либо измерительного устройства: Напишите человекообразную таблицу, содержащую измеренные значения.

Но нет очевидного случая использования по умолчанию, который имеет смысл для широкого использования. Поэтому в стандартной библиотеке нет класса WriterOutputStream. Но никто не мешает вам писать такой класс.

+0

Ну, у вас есть точка, но с другой стороны OutputStreamWriter объявляет конструктор, который принимает OutputStream, в котором применяется «кодировка символов по умолчанию». Если API поддерживает преобразование байт-ориентированного потока в ориентированный на характер поток в соответствии с определенным значением по умолчанию, не следует ли ожидать, что я могу сделать инверсию, также с таким значением по умолчанию? Поскольку API не имеет WriterOutputStream, что является самым простым обходным решением? Это то, что я (по-прежнему) ищу. – Mishax

+1

@Mishax: Простейшим обходным решением является запись ваших байтов в ByteArrayOutputStream и вызов toString() с соответствующим именем кодировки в качестве аргумента. –

+0

@JBNizet Я согласен, если ваша цель - не что иное, как строка. Но если целью является Writer, который означает начало с выходным потоком, (1), то отправьте его в ByteArrayOutputStream, (2), затем toString(), который (3) создаст Writer (4) напишите мою String. Уф! Если это самый простой обходной путь, тогда все в порядке, но, конечно, что-то вроде вашего класса Guava намного проще. – Mishax

3

Guava имеет такой класс: BaseEncoding.encodingStream(Writer) берет Writer как аргумент и обертывает его в OutputStream. Все байты, записанные в поток, кодируются baseXX (где XX может быть 16, 32, 64, ...) и записываются как символы в завернутый Writer.

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