Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用System.out和PrintWriter写入控制台_Java_Performance_Io_Console - Fatal编程技术网

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

Java 使用System.out和PrintWriter写入控制台,java,performance,io,console,Java,Performance,Io,Console,在阅读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.p

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

使用一种方法比另一种方法有什么性能优势吗?

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

但是如果你只是想在控制台上打印一些东西,那么我认为第一种方法是最好的。如果只需一行代码就可以完成,为什么要使用4到5行代码。

使用:

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

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

一个快速的Google在Coderanch上显示了一个有用的线程

还有几种其他的控制台写入方法,但使用其中一种方法似乎没有什么真正的好处,除了编写更少的代码,而且创建新的PrintWriter对象将占用更多内存(最终)


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

两种方法的不同之处在于:

  • 使用
    System.out.print(“”)时,实际上使用了
    PrintStream
    实例
  • 实际上,区别在于两类
    PrintStream
    PrintWriter
    ,它们是:

  • PrintStream
    是字节流,而
    printswrite
    是字符流
  • PrintStream
    使用平台的默认编码,而使用
    PrintWriter
    则可以传递具有特定编码的OutputStreamWriter。 对于示例:
    PrintStream=新的PrintStream(输出)
    
    PrintWriter writer=新的PrintWriter(新的OutputStreamWriter(输出,“UTF-8”))

您可以根据需要选择一种方法。

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

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

想象一个桶里有10颗鹅卵石,你想把它们移到另一个桶里。你可以抓起一把鹅卵石,把它们移过去。你不需要去拿铲子,那要花很多钱。但是,如果桶里有成千上万的鹅卵石,你就需要一把铲子,而获得铲子是值得的(在这个类比中,缓冲就是铲子)。。。这个故事的寓意是,在对数据源进行大量调用时,应该使用缓冲区

这篇文章可以更好地解释它,更详细地

下面是Oracle网站的链接,解释PrintWriter类是如何工作的

下面是一个工作示例。。。如果使用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]);
            }
    }
}

事实是,无论您使用何种技术,向控制台写入数据总是很昂贵的。我对frewper关于向控制台写入数据是昂贵的断言感到好奇。我自己也注意到了,但不知道为什么。它的缺点是I/O缓冲。有关更长时间(以Python为中心)的讨论,请查看Piët Delport对此线程的回答:
ID: 12456 (John, Lennon)
ID:   323 (Paul, McCartney)
ID:   345 (George, Harrison)
ID:  3423 (Ringo, Star)