Получить 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();
}
}
Но есть ли лучший способ? Я только хочу запустить тест!
7 ответов
Я бы использовал 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);
затем напечатать строку или получить ее, просто ссылаясь на сам поток "output". Например, вывести строку в console =>> System.out.println(output);
К вашему сведению: мой метод вызова 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());
}
Где ОС это ByteArrayOutputStream
,
baos.toString(StandardCharsets.UTF_8);
Преобразует содержимое буфера в строку путем декодирования байтов с использованием именованного набора символов.
Вот что я сделал (не используйте это в продакшене, это не очень хорошо! Но это упрощает исправление нескольких ошибок).
Создайте список, содержащий исключения.
Создайте регистратор для регистрации исключений.
Используйте код ниже:
private static void exceptionChecker() выдает Exception {if(exceptionList.isEmpty()) return; //нечего делать :) отличная новость
//create lock for multithreading synchronized (System.err){ //create new error stream ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream errorOut = new PrintStream(byteArrayOutputStream); //save standard err out PrintStream standardErrOut = System.err; try{ //set new error stream System.setErr(errorOut); exceptionList.forEach(exception -> { exception.printStackTrace(); System.err.println("<---------->"); }); } finally { //reset everything back to normal System.setErr(standardErrOut); //Log all the exceptions exceptionLogger.warning(byteArrayOutputStream.toString()); //throw final generic exception throw new Exception(); } }}
Это не очень хорошо, так как вы выдаете ошибку в блоке finally и блокирует поток ошибок, но это работает для целей разработки.
Почему бы вам не использовать ByteArrayOutputStream
? Это то, что вы должны использовать для этой цели.