【问题标题】:Why FileNotFoundException is thrown while it exists on linux为什么在 Linux 上存在 FileNotFoundException 时会抛出异常
【发布时间】:2013-08-10 01:59:20
【问题描述】:

这是我第一次在 Linux 上遇到 Java 文件访问这样的问题。问题就像标题所说的那样 - 当文件实际存在时抛出FileNotFoundException。此外,具有相同配置(props.txt 文件)的应用程序可以像在 Windows 上一样运行。 让我提供一点控制台输出

datasu@dedi2392:~/netcrawler/dkpto$ ls -l 共 20 个 -rwxrw-rw- 1 datasu datasu 114 8 月 7 日 15:53 自动更新 drwxr-xr-x 4 datasu datasu 4096 Aug 8 11:57 data drwxr-xr-x 2 数据su datasu 4096 8 月 8 日 11:57 日志 -rw-rw-rw- 1 datasu datasu 8 月 32 日 12:44 props.txt -rwxrw-rw- 1 datasu datasu 126 Aug 8 12:55 propsUpdate datasu@dedi2392:~/netcrawler/dkpto$ ./propsUpdate 父级:/usr/home/datasu/netcrawler/dkpto 1# -> 道具更新 2# -> 自动更新 3# -> 道具.txt 4# -> 数据 5# -> 日志 (没有这样的文件或目录)ava.io.FileNotFoundException:/usr/home/datasu/netcrawler/dkpto/props.txt 在 java.io.FileInputStream.open(本机方法) 在 java.io.FileInputStream.(未知来源) 在 netcrawler.Autoupdater.readProperties(Autoupdater.java:71) 在 netcrawler.Autoupdater.start(Autoupdater.java:54) 在 netcrawler.Autoupdater.main(Autoupdater.java:47) datasu@dedi2392:~/netcrawler/dkpto$ java -version java版本“1.6.0_45” Java(TM) SE 运行时环境 (build 1.6.0_45-b06) Java HotSpot(TM) 64 位服务器 VM(内部版本 20.45-b01,混合模式) 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 文件实际存在时却找不到呢?

【问题讨论】:

  • 正确的路径真的是/usr/home/datasu/吗?我不知道您的 linux/unix 版本,但它通常不是在 /home/... 上吗?特别是因为您在第一行显示了~/,它引用了主目录。
  • 这是您的 PWD 结果:datasu@dedi2392:~/netcrawler/dkpto$ pwd -> /usr/home/datasu/netcrawler/dkpto
  • 您传递给readPropertiesargs 的确切语法是什么?
  • 尝试将FileInputStreamnew File 分开,就像这样:File file = new File(args) file = file.getAbsoluteFile() FileInputStream fis = new FileInputStream(file) 这样我们可以获得更多信息

标签: java linux file


【解决方案1】:

您的主文件夹真的是这条路径吗?

/usr/home/datasu

/home/datasu 是它通常在 linux 上的位置。

另外,尝试将该行更改为:

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

如果您将其称为./propsUpdate ./props.txt,它将在当前工作目录中工作。

【讨论】:

  • 这个路径是正确的,因为你可以启动应用程序,并且父文件夹在这个路径中列出得很好(检查生成它的代码)
  • 您提供的代码是第一个版本,我已经更改它以查看异常中文件的完整路径
  • 请考虑路径是绝对的,所以工作目录不应该影响它。此外,路径是由 Java 创建的,相同的代码在 Windows 上也可以正常工作。
【解决方案2】:

字符串“args”的末尾可能有一个非打印字符,如空格。您可以在使用该变量之前使用 String.trim() 删除此类字符。

【讨论】:

  • 哇,现在真是愚蠢。我已经仔细检查了文件名中某些空格等的午餐脚本,但那里什么也没有。然而,削减论点取得了成功。感谢您的建议。今天的教训:永远不要相信命令行传递的参数。有什么办法可以让VI、VIM显示非打印文件?
  • 你总是可以echo $arg | hexdump -C
  • 0x0D0A 序列,我猜carret 回归对吗?将 args 数组传递给 main 时,它不应该被 JVM 丢弃吗?我以前从来没有遇到过这样的问题
  • 0d 是回车符,0a 是换行符。
  • @Antoniossss 我猜你的properties.load 附加了crnl
猜你喜欢
  • 2016-03-04
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多