Как записать строки в 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
выше; что обычно лучше, потому что вы можете указать кодировку для использования, избегая любых зависимостей платформы.