有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

作为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权限


共 (2) 个答案

  1. # 1 楼答案

    我今天也遇到了同样的问题,这个帖子很旧,但人们可能会在这里结束,所以:

    问题是crontab从根目录运行,因此相对路径从根(/)开始,并获得空点异常。在cronjob上,您可以在命令前面加上cd$jar。目录

    假设您的jar文件位于/home/project/data中,并且希望每晚运行:

    > crontab -e
    
    > 0 0 * * *  cd /home/project/data && /usr/bin/java -jar program.jar >> log.txt 2>&1
    
  2. # 2 楼答案

    在Java中,File中有一个名为separatorChar的字段,这正是构建独立于平台的文件名所需要的。还有一个名为separator的字段,它是同一事物的字符串版本。创建一条路径就像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作业在哪里查找文件