作为cron作业运行的linux Java控制台应用程序存在相对路径问题
在我的java程序中,我试图将一个.csv
文件保存到与主jar
文件位于同一文件夹中的data文件夹中
以前,当我在Windows机器上运行程序时,我的相对路径是:data\\foo.csv
。当我在Linux上尝试同样的方法时,它在根目录中创建并保存了名为:data\\foo.csv
的文件
然后,我尝试将路径设置为data/foo.csv
,但出现以下错误:
java.io.FileNotFoundException: data/04-12-2015.csv (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileWriter.<init>(Unknown Source)
at main.Main.saveResultsToFile(Main.java:121)
at main.Main.main(Main.java:92)
我已将目录的权限设置为777(将所有权限授予所有人)
负责创建和保存文件的代码:
String fileName = "data/foo.csv"
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
编辑:
权限不是递归的,如果这改变了什么的话。只有data
文件夹具有777权限
# 1 楼答案
我今天也遇到了同样的问题,这个帖子很旧,但人们可能会在这里结束,所以:
问题是crontab从根目录运行,因此相对路径从根(/)开始,并获得空点异常。在cronjob上,您可以在命令前面加上cd$jar。目录
假设您的jar文件位于/home/project/data中,并且希望每晚运行:
# 2 楼答案
在Java中,
File
中有一个名为separatorChar
的字段,这正是构建独立于平台的文件名所需要的。还有一个名为separator
的字段,它是同一事物的字符串版本。创建一条路径就像String fileName = "data" + File.separator + "foo.csv" ;
由于错误是文件未找到,并且不是关于权限的投诉,因此权限不是问题所在。假设您正在尝试打开一个不在那里的文件,或者您没有将该文件放在cron期望的位置
请尝试以下操作:
这将报告从相对路径名使用的已解析路径名。它至少应该告诉您cron作业在哪里查找文件