【问题标题】:Does java automatically buffer file IOs? [duplicate]java会自动缓冲文件IO吗? [复制]
【发布时间】:2016-09-23 03:58:49
【问题描述】:

我写了一个java程序,将数百万char(s)写入一个文件,如下:

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));
}

我知道,我的编程很糟糕,我没有考虑任何性能下降。该程序也运行得足够快,即在大约一分钟左右的时间内完成了 1000 万次循环。

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

我用谷歌搜索过,但没有看到任何这样的东西。

我的问题是:

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

那么,我应该认为这种做法很好吗?

我不是在问如何使它达到最佳状态。这方面有很多材料。

【问题讨论】:

  • 请包括您定义和实例化 text_writer 的位置。 PS:不要在 Java 中的变量名中使用下划线,使用 textWriter,或者更好的是,根据变量的用法而不是类型来命名变量。如果你按类型命名,你会很想重用对象,这是一种“代码味道”

标签: java performance file io


【解决方案1】:

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

new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName))),
             false

所以它会被缓冲。至少在我的 Oracle 的 JRE 版本中,但这完全是一个实现细节,并且可能因 JRE 供应商甚至同一供应商的版本而异。所以我的建议是使用PrintWriter(Writer) 构造函数实例化PrintWriter,并将缓冲的写入器作为参数传递。这样你就可以确定它会一直被缓冲。


那么,我应该认为这种做法很好吗?

没有。如果您查看write(char) 方法的实现,您会发现它执行了空值检查+ 同步。 write(char[]) 方法实际上是做同样的事情,但对整个数组一次,所以使用批量方法将节省数千次不必要的方法调用、检查和同步。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 2014-09-12
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多