1

我正在尝试在打包的 jar 之外设置一个 java .properties 文件。这是我加载它的代码:

public static final String FILENAME = "test.properties";

public static void load() throws IOException {
    FileInputStream fis = null;
    try {
        props = new Properties();
        fis = new FileInputStream(FILENAME);
        props.load(fis);
        System.out.println("Properties successfully loaded: "+props);
        validateProperties();
    } catch (FileNotFoundException e) {
        System.err.println("Properties file not found.  Creating...");
        new File(FILENAME).createNewFile();
                    //fill with default properties
        System.out.println("Properties file successfully created");
    } finally {
        if (fis != null) try {fis.close();} catch(Exception e) {}
    }
}

不幸的是,当我运行它时,我得到以下输出:

Properties successfully loaded: {}

这是test.properties:

#no comment
#Sun Jun 23 19:21:45 CDT 2013
port=55142
handSize=10
maxPlayers=8
timeout=1500

我已经通过手动读取和打印确认 FileInputStream 正在从正确的文件中读取。那么为什么我的属性没有加载呢?

编辑:这是一些直接加载属性文件内容的代码:

public static void test() throws IOException {
    FileInputStream fis = new FileInputStream(FILENAME);
    byte[] b = new byte[fis.available()];
    fis.read(b);
    String text = new String(b);
    System.out.println(text);
}

它输出:

#no comment
#Sun Jun 23 19:21:45 CDT 2013
port=55142
handSize=10
maxPlayers=8
timeout=500

所以 FIS 必须从正确的文件中读取。

编辑2:好的,所以我不知道问题出在哪里,但是我重新启动了eclipse,现在它可以工作了。非常抱歉浪费了您的时间。

4

4 回答 4

0

检查您的 java 系统使用什么行分隔符。例如:

System.out.println((int)System.getProperty("line.separator").charAt(0));

在 UNIX 上将给出 10,即 newline \n,在 Windows 上将是 13(例如: 的第一个字符\r\n)。

我认为您的 java 代码正在使用 Windows 编码读取文件,但属性文件是在 UNIX 中编辑的,因此每个文件似乎都在“单行”中——这将导致空属性,因为您的第一行已被注释

于 2013-06-24T01:14:40.903 回答
0

ResourceBundle 提供了一种非常简单的方法来访问 Java 中属性文件中的键/值对...您可以参考以下内容。

http://www.avajava.com/tutorials/lessons/how-do-i-read-a-properties-file-with-a-resource-bundle.html

当捆绑包与 jar/classes 位于同一文件夹中时,您可以在加载捆绑包时直接指定属性文件名。

于 2013-06-24T01:16:04.347 回答
0

由于您的属性文件不存在于类路径中,因此如果不提供正确的路径,您将无法读取它。有多种方法可以从 jar 中读取外部属性文件。最简单的方法之一是使用 -D 开关在 java 命令行上定义系统属性。该系统属性可能包含您的属性文件的路径。

例如

java -cp ... -Dmy.app.properties=/path/to/test.properties my.package.App

然后,在您的代码中,您可以执行以下操作:

public static final String FILENAME = "test.properties";

public static void load() throws IOException {
    FileInputStream fis = null;
    String propPath = System.getProperty(FILENAME);

    try {
        props = new Properties();
        fis = new FileInputStream(propPath);
        props.load(fis);
        System.out.println("Properties successfully loaded: "+props);
        validateProperties();
    } catch (FileNotFoundException e) {
        System.err.println("Properties file not found.  Creating...");
        new File(propPath ).createNewFile();
                    //fill with default properties
        System.out.println("Properties file successfully created");
    } finally {
        if (fis != null) try {fis.close();} catch(Exception e) {}
    }
}
于 2013-06-24T00:54:04.333 回答
0

当没有提到绝对路径时,JVM 会尝试从 JVM & 加载资源project classpath。在您的情况下,空输出表示 JVM 正在尝试从中加载属性文件,classpath但该文件不存在。

解决方案:

1)将您的属性文件放在您的类路径中

2)或提及属性文件的绝对路径。

于 2013-06-24T00:57:34.917 回答