Как записать строки в OutputStream

Как я могу создать класс, который принимает реализуемые OutputStream и записывает в него содержимое?

например, следующий метод печати неверен и не будет компилироваться. Каковы варианты или лучшие методы?

public class FooBarPrinter{
    private OutputStream o;
    public FooBarPrinter(OutputStream o){
        this.o=o;
    }

    public void print(String s){        
        o.write(s);
    }
}

3 ответов


универсальный OutputStream не имеет возможности написать String непосредственно к нему. Вместо этого вам нужно получить byte[] на String а затем запишите их в поток.

public void print(String s){ 
    o.write(s.getBytes());
}

относятся к OutputStream документация java для получения дополнительной информации о поддерживаемых типах данных записи.

мое предложение сделать это лучше, чтобы убедиться, что OutputStream вы предоставляете в конструкторе-это BufferedOutputStream, поскольку это улучшит производительность ваш код. Он работает путем буферизации некоторых данных в памяти и записи их на диск большими кусками вместо множества меньших записей.

вот документация java для BufferedOutputStream


Я думаю, что в других ответах отсутствует важный момент / вопрос.

вы действительно должны использовать OutputStream?

на OutputStream и InputStream иерархии классов предназначены для записи и чтения байта данных. Но строки Java не ориентированы на байты. Они ориентированы на символы (в первом приближении), а символы в Java-это 16-битные кодовые единицы Unicode.

при записи символов в байтовый поток, JVM должен выполнить преобразование в кодирование символы в байты. На самом деле, есть много возможных способов сделать это. Например, UTF-8 будет кодировать каждый символ в последовательности, как один или байты, латинский-1 или ASCII будет кодировать подмножество символов как одиночных байтов и превратить другие в (возможно) вопросительные знаки. И так далее.

теперь можно написать что-то вроде этого:

  public void print(String s){ 
      o.write(s.getBytes());
  }

но у него есть проблема. Проблема в том, что getBytes() метод String использует схему кодирования символов JVM по умолчанию для преобразования. И это (схема кодирования по умолчанию) зависит от среды, в которой была запущена JVM. Таким образом, этот код делает разные вещи в зависимости от окружающей среды. Теперь вы можете исправить это, указав кодировку:

  public void print(String s){ 
      o.write(s.getBytes("UTF-8"));
  }

но это становится громоздким, если вы вызываете getBytes во многих местах.

если вы делаете много текстовый вывод, лучше использовать Writer API вместо OutputStream API-интерфейс. The Writer API и его реализации имеют дело с преобразованием под капотом ... более последовательно и эффективно.

последний момент заключается в том, что есть другие API, которые могут быть полезны при выполнении текстового вывода.

  • на BufferedWriter класса (а также BufferedOutputStream) поддержите эффективный выход путем вводить буферизацию в-памяти в процесс выхода. Это сохраняет систему вызовы, особенно если вы выполняете множество небольших операций записи.
  • на PrintWriter класс предоставляет множество удобных методов, а также устраняет необходимость обработки IOExceptions. (Если происходит исключение IOException, то PrintWriter соответствующая пометка. Существует метод проверки того, произошло ли исключение. Это может быть полезно или опасно, в зависимости от того, что вы делаете ...)

чтобы написать строки, взгляните на PrintStream класса. Вы можете увидеть пример класса, который делает то, что вы намереваетесь здесь.

кроме того, вы можете обернуть OutputStream используя одним из PrintStream строителей:

public class FooBarPrinter{
  private PrintStream p;
  public FooBarPrinter(OutputStream o){
    p = new PrintStream(o);
  }
  public void print(String s){      
    p.print(s);
  }
}

редактировать: обратите внимание, что вы также можете использовать PrintWriter класса таким же образом, как PrintStream выше; что обычно лучше, потому что вы можете указать кодировку для использования, избегая любых зависимостей платформы.