Java相对文件路径

我有一个Java问题,我一直遇到麻烦:什么是指示相对文件路径的好方法。

让我更具体一点。 我希望能够总是在./configuration/file.txt查找配置文件。 我遇到的问题是我的程序只有从文件所在的目录启动才能正常工作。如果我从另一个目录启动它,如./directory/to/my/program/execute.sh然后它无法正常运行。

但是我还需要对这个文件进行更改,资源似乎想要只读…

建议(使应用程序独立于环境特定细节)读取配置信息的方法是将其作为类路径资源而不是文件系统资源读取。 阅读智能加载您的属性以获取更多详细信息。

有关如何指定资源路径的语法,请阅读Class.getResourceAsStream javadoc

关于SO的有用post: jar中的类路径资源

您需要提供一种定义目录的机制,例如通过环境变量,命令行参数,配置文件,首选项API等。

为确保您的数据始终位于同一位置,您可以使用主目录。 利用主目录将在不同平台上提供一定的一致性,您的程序可以访问数据,而不管它所在的目录。

例如:

 String userHomeDir = System.getProperty("user.home", "."); String systemDir = userHomeDir + "/.collection"; 

然后你可以稍后用类似的东西检索一个文件

 String fileLocation = systemDir + "/file.txt"; 

如果您希望/configuration/file.txt表示相对于某些内容的文件,则必须定义该内容。 我们通常会让某些东西成为“类路径或当前目录”。 您必须编写一些代码才能使其工作。 以下内容(未经测试)。

 public InputStream getResource( String path ) throws IOException { // try relative to current directory File file = new File( path ); if ( file.exists() ) { return new FileInputStream( file ); } // try the classpath return Thread.currentThread().getContextClassLoader().getResourceAsStream( path ); }