Java 是否有更好的方法覆盖文件内容?
我希望覆盖已经存在的文件的内容。很明显,我可以创建一个新文件来覆盖旧文件,如所示。然而,我正在编写一个程序,它可能会多次这样做,我希望尽可能减少不必要的开销Java 是否有更好的方法覆盖文件内容?,java,file-io,Java,File Io,我希望覆盖已经存在的文件的内容。很明显,我可以创建一个新文件来覆盖旧文件,如所示。然而,我正在编写一个程序,它可能会多次这样做,我希望尽可能减少不必要的开销 所以我的问题是:有没有更好的方法来简单地重写文件本身的内容,而不是编写一个“新”文件来替换旧文件?或者简单地覆盖整个文件内容的开销大致相当于创建新文件然后写入的开销?(根据记录,这些文件只有1KB大。)只需在链接答案中使用它作为示例。让操作系统/文件系统担心取消链接/链接索引节点、磁盘上的位置等。现在,对于绝大多数软件开发来说,很少有好的理
所以我的问题是:有没有更好的方法来简单地重写文件本身的内容,而不是编写一个“新”文件来替换旧文件?或者简单地覆盖整个文件内容的开销大致相当于创建新文件然后写入的开销?(根据记录,这些文件只有1KB大。)只需在链接答案中使用它作为示例。让操作系统/文件系统担心取消链接/链接索引节点、磁盘上的位置等。现在,对于绝大多数软件开发来说,很少有好的理由担心它
一般来说,CPU/磁盘i/o的开销不会超过很多。如果您担心磁盘i/o,请使用内存文件系统(前提是在发生崩溃时不需要保留文件)或SATA3上的高速SSD。简短回答:同时写入和配置文件 答案较长,挥手示意: 覆盖文件将涉及以下系统调用:
open
write
close
open
write
close
unlink
rename
创建新文件、删除旧文件和重命名新文件将涉及以下系统调用:
open
write
close
open
write
close
unlink
rename
系统调用通常是程序中最慢的部分;一般来说,减少系统调用是加快程序速度的好方法。覆盖一个文件将重新使用操作系统的内部目录条目数据;这可能也会导致一些速度的提高。(在有VM开销的语言中,它们可能很难测量…)
您的文件足够小,因此每个write()。(因为您关心性能,这似乎是一个安全的假设。)这确实意味着其他进程不应该看到部分写入,除非发生灾难性电源故障和有损装载选项。(不常见。)文件重新命名方法即使在多次写入时也能提供一致的文件
然而,1K文件是一种非常低效的存储机制;许多文件系统将沿4k块写入文件。如果这些数据块只存在于您的应用程序中,那么将它们写入某种容器(一次几个)可能是有意义的。(源于地震的系统通过zip文件读取地图、纹理等,因为巨大的流式IO请求比数千个较小的IO请求快得多。)当然,如果您的应用程序正在编写这些文件供其他应用程序使用,这会更加困难,但是,如果文件很少共享,可能仍然值得研究。您可以使用RandomAccessFile
以下是一个简短的示例:
// create a new RandomAccessFile with filename test
RandomAccessFile raf = new RandomAccessFile("c:/test.txt", "rw");
// write something in the file
raf.writeUTF("Hello World");
// set the file pointer at 0 position
raf.seek(0);
// print the string
System.out.println("" + raf.readUTF());
// print current length
System.out.println("" + raf.length());
// set the file length to 30
raf.setLength(30);
// print the new length
System.out.println("" + raf.length());
您确实了解文件是如何存储在磁盘上的,以及这如何限制文件的处理方式,对吗?我不确定我是否理解您的要求。我有一定程度的了解,但我不能说我是磁盘数据存储方面的专家。我是一名计算机科学专业的学生(虽然这不是家庭作业),在我的第二年和第三年之间,所以我们讨论了一些文件存储,但在我的类中一吨也没有。使用数据库或键值存储(如而不是文件)如何?@cpeisert不幸的是,我的功能有点有限-我的程序调用另一个程序,该程序将某种格式的文件作为输入。因此,我需要编写一组文件,在每个文件上调用第二个程序,获取结果,更改文件内容,然后再次执行;这是遗传算法的一部分。然而,我根本无法更改其他程序,所以我基本上只能将其视为一个黑匣子。@Donal:当你有几百万个程序时,担心是有道理的。。。还记得为NNTP服务器优化文件系统和装载选项付出了多少努力吗?:)但是,只有当您以随机访问方式访问数据,并且只有当您用完全相同长度的数据替换精确长度的数据时,才可以这样做。@IALASHKEVICH真棒,这正是我要寻找的替代方法。这些文件的长度总是大致相同的(它们基本上只是以某种模式包含数字的行),所以这似乎是可行的。但现在,最初的问题是:什么开销更小?是您的方法,还是我在原始帖子中链接到的答案的方法?如果您只重写了部分文件,那么RandomAccessFile的开销更小。重写整个文件的工作原理与对原始帖子的回答相同
由于您的程序调用另一个以某种格式化文件作为输入的程序,因此您不必担心文件写入开销,调用另一个程序将占用系统的大部分资源
我建议您在多个线程中同时编写文件和调用程序,这样您就可以获得硬件的最大性能。