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