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