2008-10-19 2 views
469

Какой лучший способ передать вывод из java.io.OutputStream в String в Java?Получите OutputStream в строку

Скажем, у меня есть метод:

writeToStream(Object o, OutputStream out) 

который записывает некоторые данные из объекта в данном потоке. Тем не менее, я хочу как можно проще получить этот вывод в String.

Я рассматриваю написание класса, как это (непроверенные):

class StringOutputStream extends OutputStream { 

    StringBuilder mBuf; 

    public void write(int byte) throws IOException { 
    mBuf.append((char) byte); 
    } 

    public String getString() { 
    return mBuf.toString(); 
    } 
} 

Но есть лучший путь? Я хочу только пройти тест!

+6

У вас есть только ASCII байты? Вам не нужна копедия? – Horcrux7 2008-10-19 20:13:35

+0

В этом случае да.Однако, хороший момент - я об этом не думал. – 2008-10-19 20:19:03

ответ

514

Я бы использовал ByteArrayOutputStream. А на финише вы можете позвонить:

new String(baos.toByteArray(), codepage); 

или лучше

baos.toString(codepage); 

Для конструкторы струны codepage может быть строкой или экземпляр java.nio.charset.Charset. Возможное значение: java.nio.charset.StandardCharsets.UTF_8.

Метод toString принимает только строку как параметр codepage (стенд Java 8).

+7

ByteArrayOutputStream не имеет метода toArray(); он действительно имеет значениеByteArray(). Можете ли вы исправить ответ? Кроме того, почему бы не использовать baos.toString (String charsetName), которое было бы немного проще. – Jonik 2009-06-07 15:29:38

+0

Спасибо за подсказку с toString (charset). Я никогда не смотрю на toString, потому что я ожидаю ByteArrayOutputStream @ 123456. Я также исправил ошибку с помощьюByteArray(). – Horcrux7 2009-06-07 18:41:05

+0

Также обратите внимание, что некоторые кодовые страницы не установлены, если вы явно не запрашиваете их с помощью специальной установки. – 2009-06-07 21:14:56

40

Мне нравится библиотека ввода-вывода Apache Commons. Взгляните на его версию ByteArrayOutputStream, которая имеет метод toString(String enc), а также toByteArray(). Использование существующих и надежных компонентов, таких как проект Commons, позволяет вашему коду быть меньше и проще расширять и перенастраивать. Удачи.

11

Вот что я в конечном итоге делает:

Obj.writeToStream(toWrite, os); 
try { 
    String out = new String(os.toByteArray(), "UTF-8"); 
    assertTrue(out.contains("testString")); 
} catch (UnsupportedEncondingException e) { 
    fail("Caught exception: " + e.getMessage()); 
} 

Где ОС является ByteArrayOutputStream.

21

это работало хорошо

OutputStream output = new OutputStream() 
    { 
     private StringBuilder string = new StringBuilder(); 
     @Override 
     public void write(int b) throws IOException { 
      this.string.append((char) b); 
     } 

     //Netbeans IDE automatically overrides this toString() 
     public String toString(){ 
      return this.string.toString(); 
     } 
    }; 

вызов метода = >>marshaller.marshal((Object) toWrite , (OutputStream) output);

затем напечатать строку или получить его просто ссылаться на «выход» поток сам В качестве примера, чтобы напечатать строку из to console = >>System.out.println(output);

FYI: мой метод вызова marshaller.marshal(Object,Outputstream) предназначен для работы с xml. Это не относится к этой теме.

Это очень расточительно для производственного использования, есть способ для многих преобразований, и он немного свободен. Это было просто закодировано, чтобы доказать вам, что вполне возможно создать пользовательский OuputStream и вывести строку. Но просто пойдите в Horcrux7, и все хорошо с двумя вызовами метода.

И мир живет на другой день ....

-11

Почему вы не используете ByteArrayOutputStream? Это то, что вы должны использовать для этой цели.

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