写入文件的最快方法?

新手上路,请多包涵

我做了一个采用 FileString 的方法。它用一个以该字符串作为其内容的新文件替换该文件。

这是我做的:

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

然而,它的速度非常慢。有时需要超过一分钟。

我如何编写包含数万到一百万个字符的大文件?

原文由 user263078 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 629
2 个回答

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

 BufferedWriter out = new BufferedWriter(new FileWriter(file), 32768);

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

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

原文由 Pointy 发布,翻译遵循 CC BY-SA 2.5 许可协议

给你一个简单的测试

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.");

印刷

Wrote 135 MB/s.

原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题