我正在尝试加载属性,如果不存在则创建属性。
好的,这里正在加载:
InputStream is = Store.class.getResourceAsStream("my.properties");
props.load(is);
但困难的部分是确定文件是否不存在并在必要时创建
尝试了这个:
File conf = null;
try {
conf = new File(Store.class.getResource("my.properties").getFile());
}
catch (Exception e){
// can't create file because getResource returns null again
conf = new File(Store.class.getResource("my.properties").getFile()); //WRONG
conf.createNewFile();
}
在这种情况下我能做些什么?
答案 0 :(得分:4)
实际上,如果该文件不存在,getResource
方法将返回null
,因此您将在try和inside catch块中获得NullPointerException
。
我实际上并不知道是否可以创建所需的文件,因为首先你需要它的完整路径,因为方法getResource
或getResourceAsStream
将返回{ {1}}。
您可以做的是获取同一文件夹中已存在的另一个资源文件的路径,并使用它来获取父文件夹的路径,然后为其添加所需的文件名。
null
但是您应该注意到项目资源实际上并不打算在运行时创建。它们应该在开发时添加,通常只读(未修改)。 如果需要在运行时更新某些文件,则应使用普通文件系统。
答案 1 :(得分:3)
getResource
和getResourceAsStream
可以从类路径中的任何位置加载资源。你不应该认为它甚至是文件系统中的文件,因为它可以在.jar文件中。因此,如果文件丢失,则不应尝试创建该文件。
相反,如果要从文件系统加载文件,则应该知道要从中加载文件的位置。您还可以考虑使用混合方法,首先尝试从资源加载它,如果找不到,则从文件系统中的特定位置加载,如果文件丢失则创建该文件。
答案 2 :(得分:2)
我认为问题在于您将属性作为资源加载,因此通常来自类路径。如果您的应用程序是作为jar分发的,那么您想要做什么?你想在哪里创建文件?
所以也许你可以这样做: