Java:如何访问我的属性文件?

时间:2015-10-16 15:21:10

标签: java

所以我的项目中有一个属性文件。我需要访问它。

这是树形结构:

+ Project Name
|--+ folder1
|--+ propertyfolder
   |--+ file.properties

或者:Project / propertyfolder / file.properties

这是我迄今为止所尝试的内容(一次一个,而不是一次完成):

// error: java.io.File.<init>(Unknown Source)
File file = new File(System.getProperty("file.properties"));
File file = new File(System.getProperty("propertyfolder/file.properties"));
File file = new File(System.getProperty("propertyfolder\\file.properties"));
File file = new File(System.getProperty("../../propertyfolder/file.properties"));

InputStream inputStream = getClass().getResourceAsStream("file.properties");
InputStream inputStream = getClass().getResourceAsStream("../../propertyfolder/file.properties");
InputStream inputStream = getClass().getResourceAsStream("propertyfolder/file.properties");
InputStream inputStream = getClass().getResourceAsStream("propertyfolder\\file.properties");

getClass()中的所有变体,例如getClass().getClassLoader()

我得到的错误是NullReferenceException。它找不到文件。我如何正确找到它?

4 个答案:

答案 0 :(得分:2)

(取自OP建议的评论)

只需使用File file = new File("propertyfolder/file.properties"),但你需要知道java进程工作目录在哪里,如果你无法控制它,请尝试一个绝对路径 /c:/myapp/propertyfolder/file.properties

您也可以使用 /myapp/propertyfolder/file.properties 路径而不使用C:磁盘字母来避免仅限Windows映射。您可以在Win,Linux,MacOSX中使用Java应用程序中的/ path分隔符。注意文本文件编码,使用InputStreamReader给出编码参数。

File file = new File("propertyfolder/file.properties");
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");
BufferedReader reader = new BufferedReader(isr);
..read...
reader.close(); // this will close underlaying fileinputstream

答案 1 :(得分:1)

为了使用getClass().resourceAsStream("file.properties"),您需要确保文件存在于类路径中。

如果你的Test.java文件被编译成bin / Test.class,那么确保bin /文件夹中的file.properties以及Test.class

否则您可以使用绝对路径,这是不可取的。

答案 2 :(得分:1)

您是否已将系统属性设置为从

加载 file.properties

1)使用-Dpropertyname = value OR

的命令行

2)System.setProperty()API OR

3)System.load(fileName)API?

如果您没有完成其中任何一个,请不要使用System.getProperty()来加载file.properties文件。

假设您尚未完成上述三项,则创建文件InputStream的最佳方法是

<强> InputStream inputStream = getClass().getResourceAsStream("<file.properties path from classpath without />");

答案 3 :(得分:0)

Properties扩展了Hashtable 因此,属性列表中的每个键及其对应的值都是一个字符串。

Properties props = new Properties();
// File - Reads from Project Folder.
InputStream fileStream = new FileInputStream("applicationPATH.properties");
props.load(fileStream);

// Class Loader - Reades Form src Folder (Stand Alone application)
ClassLoader AppClassLoader = ReadPropertyFile.class.getClassLoader();
props.load(AppClassLoader.getResourceAsStream("classPATH.properties"));
    for(String key : props.stringPropertyNames()) {
        System.out.format("%s : %s \n", key, props.getProperty(key));
    }

// Reads from src folder.
ResourceBundle rb = ResourceBundle.getBundle("resourcePATH");// resourcePATH.properties
Enumeration<String> keys = rb.getKeys();
    while(keys.hasMoreElements()){
        String key = keys.nextElement();
        System.out.format(" %s = %s \n", key, rb.getString(key));
    }

// Class Loader - WebApplication : src folder (or) /WEB-INF/classes/
ClassLoader WebappClassLoader = Thread.currentThread().getContextClassLoader();
props.load(WebappClassLoader.getResourceAsStream("webprops.properties"));

从特定文件夹中读取属性。构造路径表单ProjectName

InputStream fileStream = new FileInputStream("propertyfolder/file.properties");

如果在.txt文件中指定了Key:value对,则

public static void readTxtFile_KeyValues() throws IOException{
    props.load(new FileReader("keyValue.txt") );

    // Display all the values in the form of key value
    for (String key : props.stringPropertyNames()) {
        String value = props.getProperty(key);
        System.out.println("Key = " + key + " \t Value = " + value);
    }
    props.clear();
}