2012-02-17 56 views
2

我试图加载属性,如果它不存在创建一个。加载属性,如果不存在 - 创建它

好了,下面是装载:

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

我可以在这种情况下做?

+2

http://docs.oracle.com/javase/1.4。2/docs/api/java/io/File.html#exists%28%29 – hovanessyan 2012-02-17 12:55:55

+0

@hovanessyan您不能使用exists方法,因为conf将为空 – VextoR 2012-02-17 12:57:31

+0

您使用的构造函数:http://docs.oracle.com /javase/1.4.2/docs/api/java/io/File.html#File%28java.lang.String%29 – hovanessyan 2012-02-17 13:02:28

回答

3

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

我真的不知道是否是无论如何可以创建所需的文件,因为首先你需要它的完整路径,你不能得到,因为该方法getResourcegetResourceAsStream将返回null

你可以做的是让已经在同一文件夹中存在其他资源文件的路径,并用它来获取父文件夹的路径,然后将需要的文件名添加到它。

final File myfile = new File(new File(BooleanFact.class.getResource("existingfile").getFile()).getParentFile(), "myfile"); 
myfile.createNewFile(); 

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

+0

确切,这就是为什么我坚持) – VextoR 2012-02-17 13:10:31

2

我在想一个问题是,你装的属性作为一种资源,从classpath因此通常。如果你的应用程序是作为jar分发的,你想要做什么?你想在哪里创建文件?

因此,也许你可以这样做:如果文件在类路径中存在,比加载它作为一种资源

  • (它才有意义,如果你的罐子,或者类路径的另一个罐子,包含属性文件)
  • 如果它不存在,你必须选择一个文件夹(用户的“家庭文件夹”内的东西也许?),然后看看文件是否存在
  • 如果文件存在,您可以加载使用FileInputStream而不是来自资源的属性
  • 如果fi文件不存在,你可能想自己创建它,并为属性编写“默认”值。
3

getResourcegetResourceAsStream可以从你的classpath任何地方加载资源。您不应该认为它甚至是文件系统中的文件,因为它可以位于.jar文件中。因此,如果文件丢失,您不应该尝试创建该文件。

相反,如果你想从文件系统加载的文件,你应该知道你想从加载它的位置。您也可以考虑一种混合方法,首先尝试从资源加载它,如果找不到,则从文件系统中的特定位置加载并在文件丢失时创建该文件。

相关问题