加载属性(如果不存在) - 创建它

时间:2012-02-17 12:53:31

标签: java properties

我正在尝试加载属性,如果不存在则创建属性。

好的,这里正在加载:

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();
 }

在这种情况下我能做些什么?

3 个答案:

答案 0 :(得分:4)

实际上,如果该文件不存在,getResource方法将返回null,因此您将在try和inside catch块中获得NullPointerException

我实际上并不知道是否可以创建所需的文件,因为首先你需要它的完整路径,因为方法getResourcegetResourceAsStream将返回{ {1}}。

您可以做的是获取同一文件夹中已存在的另一个资源文件的路径,并使用它来获取父文件夹的路径,然后为其添加所需的文件名。

null

但是您应该注意到项目资源实际上并不打算在运行时创建。它们应该在开发时添加,通常只读(未修改)。 如果需要在运行时更新某些文件,则应使用普通文件系统。

答案 1 :(得分:3)

getResourcegetResourceAsStream可以从类路径中的任何位置加载资源。你不应该认为它甚至是文件系统中的文件,因为它可以在.jar文件中。因此,如果文件丢失,则不应尝试创建该文件。

相反,如果要从文件系统加载文件,则应该知道要从中加载文件的位置。您还可以考虑使用混合方法,首先尝试从资源加载它,如果找不到,则从文件系统中的特定位置加载,如果文件丢失则创建该文件。

答案 2 :(得分:2)

我认为问题在于您将属性作为资源加载,因此通常来自类路径。如果您的应用程序是作为jar分发的,那么您想要做什么?你想在哪里创建文件?

所以也许你可以这样做:

  • 如果文件存在于类路径中,则将其作为资源加载(只有你的jar或类路径的另一个jar包含属性文件才有意义)
  • 如果它不存在,你必须选择一个文件夹(可能是用户的“主文件夹”里面的东西?),然后查看该文件是否存在
  • 如果文件存在,则可以使用FileInputStream而不是从资源
  • 加载属性
  • 如果文件不存在,您可能需要自己创建,并为属性写入“默认”值。