您好我制作了一个读取配置文件的小程序。该文件存储在实际的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不包含文本文件。
答案 0 :(得分:2)
使用File
,FileInpustream
等的字符串/路径构造函数读取文件时,相对路径派生自工作目录 - 您启动程序的目录。
从Jar读取文件时,文件在jar外部,至少有两个选项:
D:/blah/foo/bar
this.getClass().getClassLoader().getResourceAsStream("myfile")
后者可能更适合读取存储在相对于应用程序位置的路径中的配置文件。
答案 1 :(得分:1)
可能还有另外一种可能性:
如果代码的一部分正在写入文件,而另一部分正在读取文件,那么最好在写入者完成写入文件之前考虑读者正在读取文件。
您可以通过将代码置于调试模式来交叉检查这种情况。如果在该处工作正常,并给您FileNotFoundException,那么肯定是造成此异常的潜在原因。
现在,如何解决:
您可以使用类似于以下代码块的重试机制
if(!file..exists()){
Thread.sleep(200);
}
在您的代码中,并根据需要更改睡眠值。
希望有帮助!!