我有一个类,其中是一个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++; } } }
答案 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文件中。 在读取属性文件之前,请检查文件是否存在。