Получить OutputStream в строку

java string io stream

570172 просмотра

4 ответа

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

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

  writeToStream(Object o, OutputStream out)

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

Я рассматриваю возможность написания такого класса (непроверенного):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

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

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

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

Автор: Adrian Mouat Источник Размещён: 24.07.2019 02:32

Ответы (4)


574 плюса

Решение

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

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

или лучше:

baos.toString( codepage );

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

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

Автор: Horcrux7 Размещён: 19.10.2008 08:15

44 плюса

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

Автор: Joe Liversedge Размещён: 19.10.2008 08:23

22 плюса

Это сработало

    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);

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

К вашему сведению: мой метод вызова marshaller.marshal(Object,Outputstream)для работы с XML. Это не имеет отношения к этой теме.

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

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

Автор: alcardenas Размещён: 20.06.2009 08:13

13 плюса

Вот что я в итоге сделал:

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.

Автор: Adrian Mouat Размещён: 03.11.2008 09:04
32x32