写入文件的最快方法?

31 java file-io

我做了一个拿a File和a的方法String.它将文件替换为带有该字符串作为其内容的新文件.

这就是我所做的:

public static void Save(File file, String textToSave) {

    file.delete();
    try {
        BufferedWriter out = new BufferedWriter(new FileWriter(file));
        out.write(textToSave);
        out.close();
    } catch (IOException e) {
    }
}
Run Code Online (Sandbox Code Playgroud)

但是它很慢.它有时需要一分钟.

如何编写成千上万的大文件,其中可能有多达一百万个字符?

Poi*_*nty 20

确保分配足够大的缓冲区:

BufferedWriter out = new BufferedWriter(new FileWriter(file), 32768);
Run Code Online (Sandbox Code Playgroud)

你在运行什么样的操作系统?这也可以产生很大的不同.然而,花一分钟写出一个不太大的文件听起来像是一个系统问题.在Linux或其他*ix系统上,您可以使用类似的东西strace来查看JVM是否进行了大量不必要的系统调用.(很久很久以前,Java I/O非常愚蠢,write()如果你不小心,会发出疯狂的低级别系统调用,但是当我说"很久以前"时,我的意思是1998年左右.)

编辑 - 请注意,Java程序以简单的方式编写一个简单文件,但速度非常慢的情况本质上是奇怪的.在写入文件时,能否判断CPU是否负载过重?不应该; 从这样的事情应该几乎没有CPU负载.

  • 好答案.事实证明它写作的原因很慢,实际上并不是因为写作方法,而是因为我使用了这么长的`String`.这是"String"的计算花了这么长时间,写作并没有花费太多时间.我的解决方案是将文件分段编写,而不是一次完成,因此要编写的`String`不会变得很大.使用您的想法也有帮助. (2认同)

Pet*_*rey 17

一个简单的测试

char[] chars = new char[100*1024*1024];
Arrays.fill(chars, 'A');
String text = new String(chars);
long start = System.nanoTime();
BufferedWriter bw = new BufferedWriter(new FileWriter("/tmp/a.txt"));
bw.write(text);
bw.close();
long time = System.nanoTime() - start;
System.out.println("Wrote " + chars.length*1000L/time+" MB/s.");
Run Code Online (Sandbox Code Playgroud)

打印

Wrote 135 MB/s.
Run Code Online (Sandbox Code Playgroud)


Wou*_*ens 5

您可以了解Java的NIO功能.它可能支持你想做的事情.

Java NIO FileChannel与FileOutputstream的性能/实用性