我需要将一个单词列表写入文件,然后将该文件保存在磁盘上。以下两种方式之一是否优于另一种方式?第二个显然使用更多的主内存,但速度有差异吗?
(这只是伪代码)
for i = 0 to i = n:
word = generateWord();
FileWriter.println(word);
end loop
与
String [] listOfWords = new List
for i = 0 to i = n:
word = generateWord();
listOfWords.add(word)
end loop
for i = 0 to n:
FileWriter.println(listOfWords[i]);
end loop
答案 0 :(得分:2)
您显示的这两种方法在磁盘使用效率方面完全相同。
在考虑磁盘写入速度时,必须始终考虑使用哪种编写器对象。有许多类型的编写器对象,当涉及实际的磁盘写入时,它们中的每一个都可能表现不同。
如果您使用的对象是其中一个写入您告诉它的确切数据的对象,那么您的写作方式效率非常低。您应该考虑切换到另一个编写器(例如BufferedWriter)或在编写之前构建一个更长的字符串。
通常,您应该尝试以符合磁盘块大小的块来编写数据。
答案 1 :(得分:1)
在您的代码和磁盘之间,您有一个类似的堆栈:Java库代码,虚拟机运行时,C运行时库,操作系统文件缓存/虚拟内存子系统,操作系统I / O调度程序,设备驱动程序和物理磁盘固件。
除非分析显示问题,否则尽可能做到最简单。其中一些层已经过调整,可以处理缓冲,批处理和调度顺序写入,因为它们是一个常见的用例。
答案 2 :(得分:0)
从FileWriter
的角度来看,你在两个例子中都做了同样的事情,所以显然文件I / O没有任何区别。而且,正如你所说,第一个的空间复杂度是O(1),而不是第二个的O(N)。