我在Eclipse中创建了一个动态Web项目,并编写了一个简单的代码来从属性文件中读取 这是我的代码
public class AutocompleteService {
public static void main (String args[])
{
Properties properties = new Properties();
properties.load(new FileInputStream("autocomplete.properties"));
System.out.println("Test : " + properties.getProperty("test"));
}
当我运行这个时,我找不到文件异常。
java.io.FileNotFoundException: autocomplete.properties (The system cannot find the file specified)
我的包结构如下
-src
- com.serive (package)
- AutocompleteService.java
- autocomplete.properties
AutocompleteService.java
和autocomplete.properties
都在同一个包中,即com.service
。我们还需要从属性文件中读取其他内容吗?
参考:http://www.exampledepot.com/egs/java.util/Props.html
〜Ajinkya。
答案 0 :(得分:7)
你必须从类路径加载它:ex
ClassLoader loader = Thread.currentThread().getContextClassLoader();
stream = loader.getResourceAsStream(fileName);
获得流后,您可以将其传递给properties.load()
答案 1 :(得分:5)
获取与您班级相关的信息流:
AutocompleteService.class.getResourceAsStream("autocomplete.properties")
答案 2 :(得分:2)
运行应用程序时,您的代码正在查看“当前目录”。
使用Class.getResourceAsStream()
从与类相同的位置读取。
答案 3 :(得分:2)
“当前”目录是您启动服务器的目录,因此请参考相对于此的文件,例如"config/autocomplete.properties"
或您喜欢的位置。
最好的方法是知道问题是什么。使用这样的代码可以帮助您调试问题:
File propertiesFile = new File("config/autocomplete.properties");
if (!propertiesFile.exists())
throw new IllegalStateException("Could not find properties file: " + propertiesFile.getAbsolutePath());
properties.load(new FileInputStream(file));
如果爆炸,异常消息将显示它认为文件的位置,并且您将很快找出如何纠正问题。
答案 4 :(得分:0)
使用相对路径创建输入流将尝试在正在运行的程序的当前目录中打开文件。在您的情况下,当前目录是您的servlet容器(Tomcat,Jetty等)的执行目录。
您要做的是在war文件中打开一个与您的类一起定位的属性文件。因此,应该通过类加载器对此属性文件进行加密,并使用Class.getResourceAsStream()
是合适的方法。查看链接的javadoc以了解提供哪种路径作为参数。