Java printstream или printwriter

Java: разница между PrintStream и PrintWriter

В чем разница между PrintStream и PrintWriter ? У них много общих методов, из-за которых я часто смешиваю эти два класса. Более того, я думаю, мы можем использовать их для одних и тех же вещей. Но должна быть разница, в противном случае был бы только один класс.

Я искал архивы, но не мог найти этот вопрос.

Это может показаться легкомысленным, но PrintStream печатает в OutputStream , а PrintWriter печатает в Writer . Хорошо, я сомневаюсь, что получу какие-либо баллы за утверждение очевидного. Но там больше.

Итак, в чем разница между OutputStream и Writer ? Оба являются потоками, с основным отличием в том, что OutputStream – это поток байтов, а Writer – это поток символов.

Если OutputStream имеет дело с байтами, как насчет PrintStream.print(String) ? Он преобразует символы в байты, используя кодировку платформы по умолчанию. Использование кодировки по умолчанию, как правило, плохо, так как это может привести к ошибкам при переходе с одной платформы на другую, особенно если вы генерируете файл на одной платформе и используете его на другой.

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

Зачем беспокоиться о наличии PrintStream в JDK, поскольку основной целью является написание символов, а не байтов? PrintStream предшествовал JDK 1.1, когда были представлены потоки символов Reader/Writer. Я полагаю, что Sun PrintStream бы от PrintStream если бы только тот факт, что он так широко используется. (В конце концов, вы бы не хотели, чтобы каждый вызов System.out генерировал устаревшее предупреждение API! Кроме того, изменение типа с PrintStream на PrintWriter в стандартных выходных потоках нарушило бы существующие приложения.)

С PrintStream вы придерживаетесь стандартного кодирования платформы.

PrintStream stream = new PrintStream(output); 

С PrintWriter вы можете передать OutputStreamWriter с определенным кодированием.

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8")); 

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

Так как JDK 1.4 можно указать кодировку символов для PrintStream. Таким образом, различия между PrintStream и PrintWriter связаны только с режимом автоматического промывки и что PrintStream не может обернуть Writer.

Писатели, такие как PrintWriter, предназначены для вывода текста, потоки для двоичного вывода. Писатели обрабатывают набор символов для вас. Потоки не потому, что предполагали, что вы не хотите такого преобразования, которое испортило бы ваши двоичные данные и использовало бы автора, если бы вы это сделали.

Вы можете писать сырые байты в Stream, а не в Writer. PrintWriter javadoc перечисляет другие отличия (самое главное, возможность установки кодировки в потоке, чтобы он мог интерпретировать необработанные байты я ‘d say).

Читайте также:  Сервер с php x64

Printwriter – это усовершенствование печати.

т.е. printstream для определенной цели.

Источник

Java printstream или printwriter

Класс PrintStream

Класс PrintStream — это именно тот класс, который используется для вывода на консоль. Когда мы выводим на консоль некоторую информацию с помощью вызова System.out.println() , то тем самым мы задействует PrintStream , так как переменная out в классе System как раз и представляет объект класса PrintStream, а метод println() — это метод класса PrintStream.

Но PrintStream полезен не только для вывода на консоль. Мы можем использовать данный класс для записи информации в поток вывода. Для этого PrintStream определяет ряд конструкторов:

PrintStream(OutputStream outputStream) PrintStream(OutputStream outputStream, boolean autoFlushingOn) PrintStream(OutputStream outputStream, boolean autoFlushingOn, String charSet) throws UnsupportedEncodingException PrintStream(File outputFile) throws FileNotFoundException PrintStream(File outputFile, String charSet) throws FileNotFoundException, UnsupportedEncodingException PrintStream(String outputFileName) throws FileNotFoundException PrintStream(String outputFileName, String charSet) throws FileNotFoundException, UnsupportedEncodingException

Параметр outputStream — это объект OutputStream, в который производится запись. Параметр autoFlushingOn при значении true позволяет автоматически записывать данные в поток вывода. По умолчанию этот параметр равен false. Параметр charSet позволяет указать кодировку символов.

В качестве источника для записи данных вместо OutputStream можно использовать объект File или строковый путь, по которому будет создаваться файл.

Для вывода информации в выходной поток PrintStream использует следующие методы:

  • println() : вывод строковой информации с переводом строки
  • print() : вывод строковой информации без перевода строки
  • printf() : форматированный вывод

Например, запишем информацию в файл:

import java.io.*; public class Program < public static void main(String[] args) < String text = "Привет мир!"; // строка для записи try(FileOutputStream fos=new FileOutputStream("C://SomeDir//notes3.txt"); PrintStream printStream = new PrintStream(fos)) < printStream.println(text); System.out.println("Запись в файл произведена"); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >

В данном случае применяется форма конструктора PrintStream, которая в качестве параметра принимает поток вывода: PrintStream (OutputStream out) . Кроме того, мы могли бы использовать ряд других форм конструктора, например, указывая названия файла для записи: PrintStream (string filename)

В качестве потока вывода используется объект FileOutputStream . С помощью метода println() производится запись информации в выходной поток — то есть в объект FileOutputStream. (В случае с выводом на консоль с помощью System.out.println() в качестве потока вывода выступает консоль)

Кроме того, как и любой поток вывода и наследник класса OutputStream он имеет метод write :

import java.io.*; public class Program < public static void main(String[] args) < try(PrintStream printStream = new PrintStream("notes3.txt")) < printStream.print("Hello World!"); printStream.println("Welcome to Java!"); printStream.printf("Name: %s Age: %d \n", "Tom", 34); String message = "PrintStream"; byte[] message_toBytes = message.getBytes(); printStream.write(message_toBytes); System.out.println("The file has been written"); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >

После выполнения этой программы получится файл со следующим содержанием:

Hello World!Welcome to Java! Name: Tom Age: 34 PrintStream

PrintWriter

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

  • PrintWriter(File file) : автоматически добавляет информацию в указанный файл
  • PrintWriter(File file, String csn) : автоматически добавляет информацию в указанный файл с учетом кодировки csn
  • PrintWriter(OutputStream out) : для вывода информации используется существующий объект OutputStream, автоматически сбрасывая в него данные
  • PrintWriter(OutputStream out, boolean autoFlush) : для вывода информации используется существующий объект OutputStream, второй параметр указывает, надо ли автоматически добавлять в OutputStream данные
  • PrintWriter(String fileName) : автоматически добавляет информацию в файл по указанному имени
  • PrintWriter(String fileName, String csn) : автоматически добавляет информацию в файл по указанному имени, используя кодировку csn
  • PrintWriter(Writer out) : для вывода информации используется существующий объект Writer, в который автоматически идет запись данных
  • PrintWriter(Writer out, boolean autoFlush) : для вывода информации используется существующий объект Writer, второй параметр указывает, надо ли автоматически добавлять в Writer данные
Читайте также:  Android java sin cos

PrintWriter реализует интерфейсы Appendable, Closable и Flushable, и поэтому после использования представляемый им поток надо закрывать.

Для записи данных в поток он также используется методы printf() и println() .

Например, применим данный класс для вывода на консоль:

try(PrintWriter pw = new PrintWriter(System.out))

В качестве потока вывода здесь применяется System.out, а на консоль будет выведена строка «Hello world!»

Источник

Formatting

Stream objects that implement formatting are instances of either PrintWriter , a character stream class, or PrintStream , a byte stream class.

Note: The only PrintStream objects you are likely to need are System.out and System.err . (See I/O from the Command Line for more on these objects.) When you need to create a formatted output stream, instantiate PrintWriter , not PrintStream .

Like all byte and character stream objects, instances of PrintStream and PrintWriter implement a standard set of write methods for simple byte and character output. In addition, both PrintStream and PrintWriter implement the same set of methods for converting internal data into formatted output. Two levels of formatting are provided:

  • print and println format individual values in a standard way.
  • format formats almost any number of values based on a format string, with many options for precise formatting.

The print and println Methods

Invoking print or println outputs a single value after converting the value using the appropriate toString method. We can see this in the Root example:

Here is the output of Root :

The square root of 2 is 1.4142135623730951. The square root of 5 is 2.23606797749979.

The i and r variables are formatted twice: the first time using code in an overload of print , the second time by conversion code automatically generated by the Java compiler, which also utilizes toString . You can format any value this way, but you don’t have much control over the results.

The format Method

The format method formats multiple arguments based on a format string. The format string consists of static text embedded with format specifiers; except for the format specifiers, the format string is output unchanged.

Читайте также:  Adu by ru homepage obrazovatelnyj protsess html

Format strings support many features. In this tutorial, we’ll just cover some basics. For a complete description, see format string syntax in the API specification.

The Root2 example formats two values with a single format invocation:

The square root of 2 is 1.414214.

Like the three used in this example, all format specifiers begin with a % and end with a 1- or 2-character conversion that specifies the kind of formatted output being generated. The three conversions used here are:

  • d formats an integer value as a decimal value.
  • f formats a floating point value as a decimal value.
  • n outputs a platform-specific line terminator.

Here are some other conversions:

  • x formats an integer as a hexadecimal value.
  • s formats any value as a string.
  • tB formats an integer as a locale-specific month name.

There are many other conversions.

Except for %% and %n , all format specifiers must match an argument. If they don’t, an exception is thrown.

In the Java programming language, the \n escape always generates the linefeed character ( \u000A ). Don’t use \n unless you specifically want a linefeed character. To get the correct line separator for the local platform, use %n .

In addition to the conversion, a format specifier can contain several additional elements that further customize the formatted output. Here’s an example, Format , that uses every possible kind of element.

3.141593, +00000003.1415926536

The additional elements are all optional. The following figure shows how the longer specifier breaks down into elements.

Elements of a Format Specifier.

The elements must appear in the order shown. Working from the right, the optional elements are:

  • Precision. For floating point values, this is the mathematical precision of the formatted value. For s and other general conversions, this is the maximum width of the formatted value; the value is right-truncated if necessary.
  • Width. The minimum width of the formatted value; the value is padded if necessary. By default the value is left-padded with blanks.
  • Flags specify additional formatting options. In the Format example, the + flag specifies that the number should always be formatted with a sign, and the 0 flag specifies that 0 is the padding character. Other flags include — (pad on the right) and , (format number with locale-specific thousands separators). Note that some flags cannot be used with certain other flags or with certain conversions.
  • The Argument Index allows you to explicitly match a designated argument. You can also specify < to match the same argument as the previous specifier. Thus the example could have said: System.out.format("%f, %

Источник

Оцените статью