Java 使用System.out和PrintWriter写入控制台
在阅读Java I/O时,我意识到有两种方法可以写入标准输出 下面是使用这两种技术的代码段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
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
则可以传递具有特定编码的OutputStreamWriter。 对于示例:PrintWriter
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)