java会自动缓冲文件IOs吗?

java会自动缓冲文件IOs吗?,java,performance,file,io,Java,Performance,File,Io,我编写了一个java程序,将数百万字符写入一个文件,如下所示: PrintWriter text_writer = new PrintWriter("SearchString.txt"); Random r = new Random(); for (int i = 0; i < NumChars; i++) { text_writer.print(alphabet.charAt(r.nextInt(N)); } PrintWriter text\u

我编写了一个java程序,将数百万字符写入一个文件,如下所示:

PrintWriter text_writer = new PrintWriter("SearchString.txt");
Random r = new Random();
for (int i = 0; i < NumChars; i++) {                
    text_writer.print(alphabet.charAt(r.nextInt(N));
}
PrintWriter text\u writer=new PrintWriter(“SearchString.txt”);
随机r=新随机();
对于(int i=0;i
我知道,我在做一个糟糕的编程,我没有考虑任何性能下降。程序也运行得足够快,也就是说,在大约一分钟左右的时间内完成了1000万次循环

一位不使用Java的同事评论说,我的代码还可以,因为它实际上并没有执行1000万次IOs。它很可能是由一个中间缓冲区自动并以最佳方式处理的

我在谷歌上搜索过,但没有看到这样的东西

我的问题是:

这是真的吗?如果是,那么,如何处理

那么,我应该考虑这个练习吗?< /P>
我不是问如何使它最优化。这方面有很多资料。

这在很大程度上取决于
PrintWriter
是如何实例化的以及JRE。在您的示例中,当使用
PrintWriter(String)
构造函数时,我们可以在JDK源代码中看到它在内部执行以下操作:

new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName))),
             false
因此,它将被缓冲。至少在我的Oracle JRE版本中,但这完全是一个实现细节,可能因JRE供应商甚至同一供应商的版本而异。因此,我建议使用
PrintWriter(Writer)实例化
PrintWriter
构造函数,并将缓冲写入器作为参数传递。这样,您可以确保它始终处于缓冲状态


那么,我应该考虑这个练习吗?< /P>
否。如果您查看
write(char)
方法的实现,您将看到它执行空检查+同步
方法实际上也是这样,但对整个数组只使用一次,因此使用批量方法将节省数千次不必要的方法调用、检查和同步。

请包括定义和实例化文本编写器的位置。PS:在Java中,不要在变量名中使用下划线,使用textWriter,或者更好的是,使用name yo你的变量在使用后,而不是类型。如果你按类型命名,你会试图重用对象,这是一种“代码气味”