我有一个针对我们正在运行的简短实验的程序,它以两种模式运行 - ' host'和'客户' 主机,每次只有一个,每隔一秒左右就会将数据写入网络驱动器上的文件(可能更多地取决于用户输入)。 客户端不会写入,而是每秒从此文件读取以更新其状态。
一位同事我提到这个设置说我应该在我的代码中包含文件锁定,否则事情可能会发生错误"。虽然我相信他们的判断并会按照他们的建议行事(他们将this与我联系起来),但我在概念上遗漏了一些东西,因为如果程序仍然正常运行,我不明白会有什么问题 - 我仍然可以捕获IO异常,所以我知道它们是否会发生(虽然它们到目前为止还没有) - 并且读取和写入都不是那么重要,以至于任何个人错过读/写操作实际上都是一种损失。如果在某个时间点读取失败,因为前一个线程处于写入中间状态,那就没关系了。它会在一秒钟之后被阅读。如果您不关心一些错过的操作并且程序仍在运行,为什么需要文件锁定?
写入文件的主机代码:
byte[] bytes = null;
try {
bytes = Data.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
try {
Files.write(logfile, bytes);
} catch (IOException e) {
e.printStackTrace();
}
客户阅读文件的代码:
byte[] fileArray = null;
String fileArrayStr = null;
try {
fileArray = Files.readAllBytes(pathState);
} catch (IOException e) {
e.printStackTrace();
}
Java 7 | Windows Vista |
答案 0 :(得分:2)
不担心IO例外情况。客户端可能同时将数据写入同一文件。当不同的线程(或可能的进程)交换进出时,这可能会导致交错效应。
答案 1 :(得分:2)
如果客户端只读取(并且只有主机写入),您可以不使用文件锁。但是,当您有多个客户端和/或主机写入时,您希望使用文件锁,这样您就不会同时写入同一文件。
使用文件锁是一种很好的做法,无论以后程序是否可以让客户编写都会发生变化。这将是先发制人的计划和良好的实践。