Получить OutputStream в строку
Какой лучший способ передать вывод из java.io.OutputStream в String в Java?
Скажем, у меня есть метод:
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();
}
}
Но есть ли лучший способ? Я хочу только запустить тест!
Ответы
Ответ 1
Я бы использовал ByteArrayOutputStream
. А на финише вы можете позвонить:
new String( baos.toByteArray(), codepage );
или лучше:
baos.toString( codepage );
Для конструктора String
codepage
может быть String
или экземпляром java.nio.charset.Charset. Возможное значение: java.nio.charset.StandardCharsets.UTF_8.
Метод toString()
принимает только String
в качестве параметра codepage
(стенд Java 8).
Ответ 2
Мне нравится библиотека Apache Commons IO. Взгляните на его версию ByteArrayOutputStream, которая имеет метод toString(String enc)
а также toByteArray()
. Использование существующих и надежных компонентов, таких как проект Commons, позволяет уменьшить размер вашего кода и облегчить его расширение и перепрофилирование.
Ответ 3
Это хорошо работало
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();
}
};
method call =>> marshaller.marshal( (Object) toWrite, (OutputStream) output);
затем напечатать строку или получить ее просто ссылку на "выходной" поток. Например, чтобы напечатать строку на консоли =>> System.out.println(output);
FYI: мой метод call marshaller.marshal(Object,Outputstream)
предназначен для работы с XML. Это не относится к этой теме.
Это очень расточительно для производственного использования, существует слишком много конверсий, и он немного свободен. Это было просто закодировано, чтобы доказать вам, что вполне возможно создать пользовательский OuputStream и вывести строку. Но просто пойдите в Horcrux7, и все хорошо с двумя вызовами метода.
И мир живет в другой день....
Ответ 4
Вот что я в итоге сделал:
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());
}
Где os - ByteArrayOutputStream
.
Ответ 5
Почему вы не используете ByteArrayOutputStream
? Это то, что вы должны использовать для этой цели.