当 Java 尝试读取文件时,我的 bash 脚本会锁定文件

当 Java 尝试读取文件时,我的 bash 脚本会锁定文件

我在 Linux (CentOS) 中有一个 bash 脚本,它将输出重定向到文件。运行需要几分钟:

./myBashScript.sh >> file.csv

我有一个 Java 应用程序尝试该文件(仅可读)以供进一步处理:

    File file = new File("file.csv");
            Scanner input = new Scanner(file);
            while (input.hasNextLine()) {
                String line = input.nextLine();
                // do something...
            }

这些进程已启动Crontab。一切运行正常,但显然每当 bash 脚本将输出重定向到文件时,Java 应用程序都无法读取它。日志显示"File not found"异常!

文件被锁定了吗?!我该如何解决这个问题?

答案1

尝试/捕获并重试... 锁定的存在是有原因的。如果文件仍在写入,您不想读取它。即使您可以,也至少会有一种情况,即当 CSV 生成尚未完成时,您的 Java 代码认为它已经读取了整个文件。

事实上,您的代码是危险的,该文件很可能在附加到它的两个 shell 命令之间关闭,因此您的 Java 代码可以在 shell 脚本运行时打开并锁定该文件。

因此,要么在文件完全生成后启动 Java 代码,要么如果 Java 代码正在监视文件,则以临时名称生成文件,然后在完成后重命名为预期名称。

相关内容