为什么在Linux上存在的情况下会抛出FileNotFoundException异常

6
这是我第一次在Linux上使用Java访问文件时遇到的问题。问题就像标题所说 - 当文件实际存在时,会抛出FileNotFoundException异常。此外,具有相同配置(props.txt文件)的应用程序在Windows上运行得很好。 让我提供一点控制台输出
datasu@dedi2392:~/netcrawler/dkpto$ ls -l
total 20
-rwxrw-rw- 1 datasu datasu  114 Aug  7 15:53 autoupdate
drwxr-xr-x 4 datasu datasu 4096 Aug  8 11:57 data
drwxr-xr-x 2 datasu datasu 4096 Aug  8 11:57 log
-rw-rw-rw- 1 datasu datasu   32 Aug  8 12:44 props.txt
-rwxrw-rw- 1 datasu datasu  126 Aug  8 12:55 propsUpdate
datasu@dedi2392:~/netcrawler/dkpto$ ./propsUpdate
Parent: /usr/home/datasu/netcrawler/dkpto
   1# -> propsUpdate
   2# -> autoupdate
   3# -> props.txt
   4# -> data
   5# -> log
 (No such file or directory)ava.io.FileNotFoundException: /usr/home/datasu/netcrawler/dkpto/props.txt
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.(Unknown Source)
        at netcrawler.Autoupdater.readProperties(Autoupdater.java:71)
        at netcrawler.Autoupdater.start(Autoupdater.java:54)
        at netcrawler.Autoupdater.main(Autoupdater.java:47)
datasu@dedi2392:~/netcrawler/dkpto$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
datasu@dedi2392:~/netcrawler/dkpto$
这是负责生成该输出的Java代码(至少在调用./propsUpdate后)
private void readProperties(String args) throws FileNotFoundException, IOException {
    System.out.println("Parent: " + new     File(args).getAbsoluteFile().getParentFile().getAbsolutePath());
    CommonTools.PrintArray(new File(args).getAbsoluteFile().getParentFile().list());
    properties.load(new FileInputStream(new File(args).getAbsoluteFile())); // this line throws the exception
    stageNumber = Integer.parseInt(properties.getProperty(PROP_STAGE_NUMBER_KEY, "0"));
}

所以为什么实际上props.txt文件已经存在,但是却找不到它呢?

1
正确的路径是/usr/home/datasu/吗?我不知道你的Linux/Unix版本,但通常它不是在/home/...某个地方吗?特别是因为你在第一行显示了~/,这指的是主目录。 - DrColossos
这是您的PWD结果: datasu@dedi2392:~/netcrawler/dkpto$ pwd -> /usr/home/datasu/netcrawler/dkpto - Antoniossss
1
你传递给 readPropertiesargs 的确切语法是什么? - hax0r_n_code
尝试将FileInputStreamnew File分开。 像这样: File file = new File(args) file = file.getAbsoluteFile() FileInputStream fis = new FileInputStream(file) 这样我们可以获得更多信息。 - Levente Kurusa
2个回答

9

字符串 "args" 可能在末尾有一个非打印字符,比如空格。在使用该变量之前,您可以使用 String.trim() 函数来删除这些字符。


2
哇,这真是太蠢了。我已经仔细检查了启动脚本中文件名是否有空格等问题,但没有发现任何问题。然而,修剪参数却起到了作用。感谢您的建议。今天的教训是:永远不要相信通过命令行传递的参数。有没有办法使VI、VIM显示非打印字符? - Antoniossss
你可以随时使用 echo $arg | hexdump -C - hax0r_n_code
0d 是回车符,而 0a 则是换行符。 - hax0r_n_code
@Antoniossss 我猜你的 properties.load 方法是在末尾添加了 crnl - hax0r_n_code
如果您展示给我们该shell脚本,或许我们就能看出问题出在哪里。 - Ernest Friedman-Hill
显示剩余2条评论

2
今日免费次数已满, 请开通会员/明日再来
/usr/home/datasu

/home/datasu 是 Linux 上通常的位置。

另外,尝试将该行更改为以下内容:

properties.load(new FileInputStream(new File(args));

如果你以这种方式调用:./propsUpdate ./props.txt,那么它将从当前工作目录起作用。

这个路径是正确的,因为你可以看到应用程序已经启动,并且父文件夹也可以通过这个路径正常列出(请检查生成它的代码)。 - Antoniossss
您提供的代码是第一个版本,我已经进行了更改以在异常中查看文件的完整路径。 - Antoniossss
请考虑到路径是绝对的这个事实,所以工作目录不应该影响它。此外,路径是由Java创建的,同样的代码在Windows上运行得很好。 - Antoniossss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接