【发布时间】:2019-07-09 15:00:45
【问题描述】:
我需要检查Strings 的List 是否包含某些预定义字符串,并且 - 如果所有这些预定义字符串都包含在列表中 - 我需要将列表写入文件。
作为第一种方法,我想这样做
if(doesTheListContainPredefinedStrings(list))
writeListIntoFile(list);
doesTheListContainPredefinedStrings 和 writeListIntoFile 执行循环以分别检查 prefefinedStrings 并将列表的每个元素写入文件。
但是 - 因为在这种情况下我必须担心性能 - 我想利用这样一个事实,即在 doesTheListContainPredefinedStrings 方法中,我仍在评估列表中的元素一次。
我也想过
String[] predefinedStrings = {...};
...
PrintWriter pw = new FileWriter("fileName");
int predefinedStringsFound = 0;
for (String string : list)
{
if (predefinedStrings.contains(string))
predefinedStringsFound++;
pw.println(string);
}
if (predefinedStringsFound == predefinedStrings.length)
pw.close();
因为我观察到 - 至少在我正在开发的系统(Ubuntu 19.04)上 - 如果我不关闭流,则字符串不会写入文件。 尽管如此,这个解决方案似乎真的很糟糕,并且仍然会创建文件,所以 - 如果列表无法通过检查 - 无论如何我都会遇到删除它的问题(这需要再次访问存储)。
有人可以建议我更好/最好的方法,并解释为什么它对我更好/最好?
【问题讨论】:
-
你应该考虑成功的概率。如果在大多数情况下,所有预定义的字符串都在列表中,那么您的第二个解决方案似乎是有效的。如果没有,您将失去性能,因为您正在对磁盘进行大量不必要的(缓慢)写入,在这种情况下,第一个选项更好 imo。
-
假设您在 @Conffusion 的消息中属于“通常成功”类别,您始终可以将文件写入临时目录(由您的操作系统自动清理的目录)和在成功的情况下执行
Files.move(假设临时目录与您的另一台机器位于同一驱动器上,这应该很好且快速),并在失败的情况下将其保留在那里。保存您直接删除。