无法通过帮助程序类在servlet中打开属性文件

时间:2011-10-17 08:59:04

标签: java servlets

我有一个类,其中是一个func,它打开一个属性文件。当我在同一课堂上写主要内容时调用该函数,我能够打开属性文件n读取。但是,当我想通过创建该类的实例来调用我的servlet中的相同func时,我得到文件未找到异常。

这是我在类中编写的函数,用于读取属性文件。我的类和servlet都在src文件夹中。我正在使用eclipse IDE。

代码:

private void readPropertiesFileAndFieldListData() {
        String PROP_FILE = "./src/fields.properties";
        try {
            FileReader reader = new FileReader(PROP_FILE);
            BufferedReader br = new BufferedReader(reader);
            ArrayList<String> field = new ArrayList<String>();
            while ((str = br.readLine()) != null) {
                if (!str.startsWith("#") && str.trim().length() > 0) {
                    // System.out.println(str);
                    field.add(str);
                    count++;
                }
            }
}

2 个答案:

答案 0 :(得分:4)

您依赖于磁盘文件系统路径的当前工作目录。当前工作目录取决于应用程序的启动方式,并且可以从应用程序内部 控制。依靠它是一个非常糟糕的主意。

通常的做法是将该文件放在类路径中或将其路径添加到类路径中。您的文件显然已经在类路径中(您将其放在src文件夹中),因此您无需更改任何其他内容。您应该通过类加载器从类路径中获取它。这比磁盘文件系统路径更便携。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("fields.properties");
// ...

另见:


对具体问题

无关,你基本上正在重新发明the java.util.Properties class。不要那样做。使用以下构造:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("fields.properties");
Properties properties = new Properties();
properties.load(input);
// ...

答案 1 :(得分:1)

PLease编写一个小测试,用于将“PROP_FILE”的文件路径打印到日志或控制台。 看来,你的相对路径是不正确的。

您的相对路径起点可能会发生变化,具体取决于* .exe文件的启动位置。

您的测试应该打印

File tFile = new File(PROP_FILE);
// print tFile.getAbsolutePath()

通过调用

获得特殊课程会更好
SomeClass.class.getResource(name)

来自Bundle的Eclipse RCP

Bundle.getResource(ResourcePathString)

修改

请检查资源是否属于* .jar。可能是,您错过了将其添加到build.properties文件中。 在读取属性文件之前,请检查文件是否存在。