6

Как получить OutputStream в String?

1

Вопрос: Как лучшим образом перенаправить вывод из java.io.OutputStream в String на 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();
  }
}

Но есть ли более лучший способ? Мне нужно просто запустить тест!

2 ответ(ов)

0

Это сработало отлично

OutputStream output = new OutputStream() {
    private StringBuilder string = new StringBuilder();

    @Override
    public void write(int b) throws IOException {
        this.string.append((char) b );
    }

    // Netbeans IDE автоматически переопределяет этот метод toString()
    public String toString() {
        return this.string.toString();
    }
};

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

Чтобы распечатать строку или получить её, просто обратитесь к самому "output" потоку. Например, чтобы вывести строку в консоль → System.out.println(output);

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

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

И мир живёт дальше...

0

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

Obj.writeToStream(toWrite, os);
try {
    String out = new String(os.toByteArray(), "UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncodingException e) {
    fail("Поймана исключительная ситуация: " + e.getMessage());
}

Где os — это объект ByteArrayOutputStream.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь