我在 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 代码正在监视文件,则以临时名称生成文件,然后在完成后重命名为预期名称。