ByteArrayOutputStream to CharBuffer - PullRequest
0 голосов
/ 07 мая 2009

У меня есть вход ByteArrayOutputStream и мне нужно преобразовать его в CharBuffer.

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

Я пытался сделать следующее, но у меня нет кодировки для строки, поэтому приведенный ниже код не будет работать (неверный вывод).

ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray());
CharBuffer document = byteBuffer.asCharBuffer();

Ответы [ 3 ]

2 голосов
/ 07 мая 2009

Вы должны предоставить кодировку. Как класс должен знать, как конвертировать. Не можете ли вы определить кодировку перед записью в ByteOutputStream или полностью избежать потока. Если нет, то вы должны делать предположения и можете потерпеть неудачу

Предоставляя кодировку, вы можете преобразовать байтовый буфер в буфер символов

Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(yourByteBuffer);
0 голосов
/ 07 мая 2009

ByteBuffer.asCharBuffer() предполагает, что байты являются UTF-16. (Я не могу найти ничего в документах, где это явно сказано, но реализация просто обрабатывает пары байтов как младшие и старшие байты символов.) Если вам нужна другая кодировка, вам придется использовать другой подход.

Самый простой подход - просто создать String:

CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding));

Я знаю, что вы сказали, что "пытались избежать создания новой строки", но ваш фрагмент кода все равно выделял отдельный байтовый массив (ByteArrayOutputStream.toByteArray() "Создает вновь выделенный байтовый массив" в соответствии с документацией). Поскольку CharBuffer поддерживает произвольный доступ, а многие кодировки (в частности, UTF-8) имеют переменную ширину, в любом случае, лучше всего просто преобразовать все это в начальные символы.

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

0 голосов
/ 07 мая 2009

ByteBuffer.asCharBuffer дает вам буквально два byte с char (с большим или меньшим порядковым номером) с обновлениями, отраженными в обоих буферах.

Предположительно, вы хотите перейти от byte с к char с через некоторое разумное кодирование. Есть много способов сделать это. Например, [новая строка (байт [], кодировка строки)] [1]. В основном они пройдут через CharsetEncoder в той или иной форме. Тогда должно быть просто получить 1010 * оттуда.

CharBuffer - вещь довольно низкого уровня. Вы уверены, что это действительно то, что вы хотите?

[1]: http://file:///C:/Users/tackline/sun/docs/api/java/lang/String.html#String(byte[], java.lang.String)

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