gpt4 book ai didi

java - 不同进程读写文件 "simultaneously"

转载 作者:行者123 更新时间:2023-11-30 04:18:28 29 4
gpt4 key购买 nike

我有两个 Java 进程,ProcessorSimulator模拟器每5秒向File X写入规定的数据记录(10行文本)。 处理器不断读取该文件,等待 token 指示有效记录。代码是这样的(对文件名进行了一些替换):

模拟器中,每5秒:

FileWriter fileWriter = new FileWriter(DATA_FILE, true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(DATA);
bufferedWriter.close();

处理器中,不断地:

mScanner = new Scanner(new BufferedReader(
new FileReader(DATA_FILE)));
mScanner.useLocale(Locale.UK);

while (true) {
while (mScanner.hasNextLine()) {
// Parse the data bundle.
if (parseDataBundle()) {
...
}
}
}

以前,处理器连接到InputStream,并且使用扫描器(适当配置)读取数据没有问题到达。

在这里,通过在记事本中刷新文件,我可以看到数据在生成时已正确写入。但是,当使用文件而不是 InputStream 时,永远不会到达 if ( parseDataBundle()) { 行。

我做错了什么? 处理器似乎拥有文件资源,因为我无法在它运行时删除它。我的直觉认为这可能与滥用并发性有关。

最佳答案

我想说这是对文件的滥用。文件不是为消息传递而设计的。一旦到达文件末尾,就完成了。避免这种情况的唯一方法是确保仅在知道有更多数据时才读取(通过检查长度),这在使用文本时会更加复杂。

您可以使用带有文本的文件,但这很棘手。您必须有一个线程轮询文件大小,当文件大小发生变化时,仅读取添加的字节(而不是更多)。这可以写入管道。您的读取线程可以使用 InputStreamReader 和 BufferedReader 从管道中读取数据。

<小时/>

要改变轮询间隔,您可以使用逐步增加的 sleep 间隔,例如

long lastSize = 
int maxSleep = 5000, sleep = 200;
while(!Thread.currentThread().isInterrupted()) {
long size = file.length();
if (size > lastSize) {
copyData(size - lastSize);
lastSize = size;
sleep = 200;
} else {
Thread.sleep(sleep);
sleep += 200;
if (sleep > maxSleep)
sleep = maxSleep;
}

这种方法的好处是它的 sleep 时间会根据它获取消息的速率进行调整。

关于java - 不同进程读写文件 "simultaneously",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17745738/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com