使用System.out和PrintWriter写入控制台

Cha*_*ani 29 java io console performance

在阅读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();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用一个比另一个有任何性能优势吗?

Hen*_*son 18

一个快速的谷歌在Coderanch上发布了一个很有用的帖子.

还有其他几种方法可以进行控制台编写,但除了编写较少的代码之外,使用其中一种方法似乎没有任何实际好处,并且创建新的PrintWriter对象将占用更多内存(最终).

PrintWriter可以写入除控制台之外的其他来源,它可以写入HttpResponse,例如System.out.println只写入控制台.


Sam*_*Sam 17

不同的两种方法是:

  • 当你使用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"));

您可以根据自己的要求选择方法.


Cla*_*lay 5

根据您要执行的 I/O 量,使用缓冲区可能有很多好处。理想情况下,您应该限制对输入源的调用次数,并将字节作为块读取。

想象一下一个桶里有 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

这是一个工作示例...如果您使用 System.in 实例化该对象,则可以使用 PrintWriter 类写入控制台。确保还传入“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]);
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

ID: 12456 (John, Lennon)
ID:   323 (Paul, McCartney)
ID:   345 (George, Harrison)
ID:  3423 (Ringo, Star)
Run Code Online (Sandbox Code Playgroud)