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

在阅读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(); } } 

使用一个优于另一个是否有任何性能优势?

一个快速的谷歌在Coderanch上发布了一个很有用的post。

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

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

不同的两种方法是:

  • 当您使用System.out.print("")您实际使用了PrintStream实例。
  • 实际上,区别在于两个类PrintStreamPrintWriter ,它们是:

    1. PrintStream是一个字节流,而PrintWrite是一个字符流。
    2. PrintStream使用平台的默认编码,而使用PrintWriter您可以传递具有特定编码的OutputStreamWriter。 for sample: PrintStream stream = new PrintStream(output); PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

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

不仅有两种方法,您还可以找到其他一些方法。 例如,使用Consol类的io包,并且可能会为此提供更多类。

但是如果你只是想在consol中打印一些东西,那么我认为第一种方法是最好的。 如果只能在一行中完成,为什么要使用4到5行代码。

使用:

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

这是一个静态调用,比其他选项更快。 另外,在第二个选项中,不要创建任何其他对象,如PrinterWriter对象。

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

想象一下有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: 12456 (John, Lennon) ID: 323 (Paul, McCartney) ID: 345 (George, Harrison) ID: 3423 (Ringo, Star) 

使用PrintWriter使输出可以国际化 – 因为可以指定像UTF-8这样的编码。 PrintWriter和PrintStream类都应该只用于控制台输出之类的活动 – 而不是用于网络编程 – 因为它们依赖于平台,可以处理换行和吞没exception情况。 “Java网络编程”的第二章对此进行了很好的讨论。