簡體   English   中英

Java:如何訪問我的屬性文件?

[英]Java: How do I access my properties file?

所以我的項目中有一個屬性文件。 我需要訪問它。

這是樹形結構:

+ 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 找不到文件。 我如何正確找到它?

(摘自評論,回答為OP建議)

只需使用File file = new File("propertyfolder/file.properties")但您確實需要知道Java進程工作目錄在哪里,如果無法控制它,請嘗試使用絕對路徑/c:/myapp/propertyfolder/file.properties

您也可以使用不帶C:盤符的/myapp/propertyfolder/file.properties路徑,以避免僅Windows映射。 您可以在Win,Linux,MacOSX中的Java應用程序中使用/路徑分隔符。 注意文本文件的編碼,請使用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

為了使用getClass().resourceAsStream("file.properties")您需要確保文件在類路徑中。

也就是說,如果你的Test.java文件編譯成BIN /的Test.class然后確保有file.properties在bin /文件夾中的Test.class一起

否則,您可以使用絕對路徑,這是不可取的。

您是否設置了系統屬性以從中加載file.properties

1)命令行使用-Dpropertyname = value或

2)System.setProperty()API或

3)System.load(fileName)API?

如果您尚未執行任何操作,請不要使用System.getProperty()加載file.properties文件。

假設您還沒有完成上述三項操作,那么創建文件InputStream的最佳方法是

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

屬性擴展了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文件中指定了“鍵:值”對,

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM