在我的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权限。
答案 0 :(得分:1)
在Java中,File
中有一个名为separatorChar
的字段,它正是您构建与平台无关的文件名所需要的。还有一个名为separator
的字段,它是同一个字符串的String版本。制作路径就像String fileName = "data" + File.separator + "foo.csv" ;
由于错误是找不到文件而不是有关权限的投诉,因此权限不是问题。大概那么你要么试图打开一个不存在的文件,要么你没有把文件放在cron所期望的地方。
尝试以下方法:
File f = new File( "data" + File.separator + "foo.csv" ) ;
System.err.println( "Path being used is : " + f.getCanonicalPath() ) ;
这应该报告从相对路径名中使用的已解析路径名。它至少应该告诉您cron作业正在查找文件的位置。
答案 1 :(得分:0)
我今天遇到了同样的问题,帖子虽然很旧,但是人们可能会在这里结束:
问题是crontab从根目录运行,因此相对路径从根(/)开始并获得空点异常。在cronjob上,您可以在命令前加上 cd $ jar.directory
假设您的jar文件位于/ home / project / data中,并希望您每晚运行:
> crontab -e
> 0 0 * * * cd /home/project/data && /usr/bin/java -jar program.jar >> log.txt 2>&1