Получить 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);

Преобразует содержимое буфера в строку путем декодирования байтов с использованием именованного набора символов.

Java 14 - https://docs.oracle.com/

Вот что я сделал (не используйте это в продакшене, это не очень хорошо! Но это упрощает исправление нескольких ошибок).

  • Создайте список, содержащий исключения.

  • Создайте регистратор для регистрации исключений.

  • Используйте код ниже:

    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? Это то, что вы должны использовать для этой цели.

Другие вопросы по тегам