0

嗨,我制作了一个读取配置文件的小程序。该文件存储在实际的 jar 文件之外。实际上与 jarfile 处于同一级别。当我从实际目录(即 D:\test\java -jar name.jar argument0 argument1)中的命令行启动我的程序时,程序运行完美。

但是当我尝试从另一个位置运行程序时,实际目录我得到了 filenotfound 异常(即 D:\java -jar D:\test\name.jar argument0 argument1)。

基本功能似乎确实有效,我做错了什么?

根据要求的部分代码:

public LoadConfig() {
    Properties properties = new Properties();

    try {
        // load the properties file
        properties.load(new FileInputStream("ibantools.config.properties"));

    } catch (IOException ex) {
        ex.printStackTrace();
    } // end catch

    // get the actual values, if the file can't be read it will use the default values.
    this.environment = properties.getProperty("application.environment","tst");
    this.cbc = properties.getProperty("check.bankcode","true");
    this.bankcodefile = properties.getProperty("check.bankcodefile","bankcodes.txt");
} // end loadconfig

该文件夹如下所示: 在此处输入图像描述

这有效: 在此处输入图像描述

这不会: 在此处输入图像描述

jar 不包含文本文件。

4

2 回答 2

2

使用 , 等的 String/path 构造函数读取文件时FileFileInpustream相对路径派生自工作目录 - 您启动程序的目录。

从 Jar 读取文件时,该文件位于 jar 外部,您至少有两个选项:

  1. 提供绝对路径:D:/blah/foo/bar
  2. 将文件所在的目录作为类路径的一部分并使用this.getClass().getClassLoader().getResourceAsStream("myfile")

后者可能更适合读取存储在相对于应用程序位置的路径中的配置文件。

于 2013-06-26T13:54:40.520 回答
1

可能还有一种可能:

如果您的代码的一部分正在写入文件而另一部分正在读取,那么最好在编写器完成文件写入之前考虑读取器正在读取。

您可以通过将代码置于调试模式来交叉检查这种情况。如果它在那里工作正常并给你 FileNotFoundException,那么这肯定是这个异常的潜在原因。

现在,如何解决:

您可以使用类似于以下代码块的重试机制

if(!file..exists()){
    Thread.sleep(200);
}

在您的代码中并根据您的需要更改睡眠值。

希望有帮助。!!

于 2019-02-04T12:44:16.667 回答