并行写入和读取文件



我想在我的系统中有一个中央日志文件,某个应用程序可以对其进行写入和读取。写操作是针对新数据,读操作是将生成的数据与写入的数据进行比较。我希望这个应用程序一次在多个实例中运行,这意味着我需要找到一种方法从文件中读取差异,然后写入。我已经看到了这段代码,但它是很好的一遍文件,我没有看到它在多个实例中工作。我正在构建这个应用程序作为命令行工具,所以我在考虑为每个实例创建一个文件,并将其迁移到"通用";日志文件。我想听听论坛对这个问题的不同看法。我担心的是有几个实例对同一个文件进行读写并生成锁。这是我目前找到的代码:

public class Tp {
public static void main(String[] args) throws IOException{
File f = new File("/path/to/your/file/filename.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
BufferedReader br = new BufferedReader(new  FileReader(f));
bw.write("Some text");
bw.flush();
System.out.println(br.readLine());
bw.write("Some more text");
bw.flush();
bw.close();
br.close();
}
}

您似乎不仅在一个程序中,而且在一个线程中尝试写入和读取相同的文件。我不相信这会有什么好处,因为在程序中你知道你写了什么,所以你可以摆脱整个I/O逻辑。

一开始试着写两个不同的程序作为独立的进程运行。如果需要,您仍然可以尝试将它们作为单独的线程放入同一个JVM中。

书写肯定没有问题,所以更有趣的部分是阅读逻辑。我可能会实现这个算法:

  • 循环直到程序终止…
    • 打开文件,使用skip()跳转到有新数据的位置
    • 使用现有数据
    • 记住读取了多少字节/记住文件大小
    • 关闭文件
    • 等待文件更改

等待文件更改可以通过监视file来完成。lastModified或File。

但是要注意,如果有多个应用程序并行地写入同一个文件,它可能会破坏数据中任何有意义的结构。Log4j确保来自一个应用程序/多个线程的并行写入将正确地进入文件。如果您需要多个进程运行同步写操作,请考虑登录到数据库。

最新更新