Запись в консоль с помощью System.out и PrintWriter - PullRequest
28 голосов
/ 29 февраля 2012

Читая о Java I / O, я понял, что есть два способа, которыми я могу записать в стандартный вывод.

Ниже приведен фрагмент, который использует обе техники

import java.io.*;
public class ConsoleIO {

    public static void main(String[] args) {
        System.out.println("Method 1");

        PrintWriter writer = new PrintWriter(System.out);
        writer.println("Method 2");
        writer.flush();
        writer.close();
    }
}

Есть ли какие-либо преимущества в производительности при использовании одного над другим?

Ответы [ 6 ]

17 голосов
/ 29 февраля 2012

отличается от двух подходов:

  • Когда вы используете System.out.print(""), вы фактически использовали PrintStream экземпляр.
  • На самом деле разница в двух классах PrintStream и PrintWriter:

    1. PrintStream - поток байтов, а PrintWrite - поток символов.
    2. PrintStream использует кодировку платформы по умолчанию, в то время какоднако с PrintWriter вы можете передать OutputStreamWriter с определенной кодировкой.Например: PrintStream stream = new PrintStream(output); PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

Вы можете выбрать подход с вашими требованиями.

17 голосов
/ 29 февраля 2012

Быстрый Google обнаружил нить на Coderanch, которая была полезна.

Существует несколько других способов написания консоли, но, по-видимому, нет реальной выгоды от использования того или другого, кроме меньшего количества кода для записи и того, что создание нового объекта PrintWriter займет больше памяти (в конце концов).

PrintWriter может записывать в другие источники, кроме консоли, он может записывать в HttpResponse, например, в то время как System.out.println записывает только в консоль.

2 голосов
/ 06 мая 2018

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

Представьте себе ведро с 10 камешками, и вы хотите переместить их в другое ведро.Вы можете взять горсть камешков и просто переместить их.Вам не нужно идти, чтобы взять лопату, это слишком много.Но если в ведре тысячи гальки, вам понадобится лопата, и стоит приложить усилия, чтобы получить лопату (в этой аналогии буфер - лопата) ... Мораль этой истории в том, что выследует использовать буфер, когда вы собираетесь делать много обращений к источнику данных.

Эта статья может объяснить это лучше и более подробно ... http://pzemtsov.github.io/2015/01/19/on-the-benefits-of-stream-buffering-in-Java.html

Вот ссылка на сайт Oracle, объясняющий, как работает класс PrintWriter.https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html

Вот рабочий пример ... Вы можете использовать класс PrintWriter для записи в консоль, если вы создаете объект с помощью System.in.Не забудьте также передать значение «true», чтобы оно автоматически очищалось.

import java.io.*;

public class PrintWriterExample
{
    public static void main(String args[]) throws IOException
    {
        int [] id = {12456, 323, 345, 3423};
        String [] firstName = {"John", "Paul", "George", "Ringo"};
        String [] lastName = {"Lennon", "McCartney", "Harrison", "Star"};

        PrintWriter outFile = new PrintWriter(System.out, true);
        String format = "ID: %5d (%s, %s)\n";

            for (int i=0; i<id.length; i++)
            {
                outFile.printf(format, id[i], firstName[i], lastName[i]);
            }
    }
}

Вот вывод:

ID: 12456 (John, Lennon)
ID:   323 (Paul, McCartney)
ID:   345 (George, Harrison)
ID:  3423 (Ringo, Star)
2 голосов
/ 17 февраля 2014

Использование PrintWriter делает вывод интернационализируемым - потому что можно указать кодировки, такие как UTF-8. Классы PrintWriter и PrintStream следует использовать только для таких действий, как вывод на консоль, а не для сетевого программирования, поскольку они зависят от платформы и переносят разрывы строк и проглатывают условия исключений. Во второй главе «Сетевое программирование на Java» есть хорошее обсуждение этого вопроса.

2 голосов
/ 29 февраля 2012

Использование:

System.out.println("Method 1");

Это статический вызов, который быстрее, чем другой вариант. Кроме того, вы не создаете никаких дополнительных объектов, таких как объект PrinterWriter, во втором варианте.

2 голосов
/ 29 февраля 2012

Есть не только два способа, вы также можете найти другие способы сделать это. Например, используя класс Consol пакета io, и может предложить еще несколько классов для этого.

Но если вы просто хотите что-то напечатать в консоли, то я думаю, что первый метод - лучший. Зачем вам использовать от 4 до 5 строк кода, если это можно сделать всего за 1 строку.

...