Java 讀取配置文件的五種方式


方式一:采用ServletContext讀取,讀取配置文件的realpath,然后通過文件流讀取出來。

因為是用ServletContext讀取文件路徑,所以配置文件可以放入在WEB-INFclasses目錄中,也可以在應用層級WEB-INF的目錄中。
文件存放位置具體在eclipse工程中的表現是:可以放在src下面,也可放在web-info及webroot下面等。
因為是讀取出路徑后,用文件流進行讀取的,所以可以讀取任意的配置文件包括xml和properties。缺點:不能在servlet外面應用讀取配置信息。

具體舉例如下:

    //ServletContext.getRealPath(name)讀取路徑 private void test1(HttpServletRequest request, HttpServletResponseresponse) throws ServletException,IOException { //response.setContentType("text/html;charset=utf-8"); String path = "/WEB-INF/jdbc_connection.properties"; //讀取WEB-INF中的配置文件 String realPath = getServletContext().getRealPath(path); //getServletContext()相當於http://localhost/demo05 //所以后面的path只需要以應用demo05/開頭具體的部署目錄路徑即可,如上面的/web-in… System.out.println(realPath); InputStreamReader reader =new InputStreamReader(newFileInputStream(realPath),"utf-8"); Properties props = new Properties(); props.load(reader); //load個人建議還是用Reader來讀,因為reader體系中有個InputStreamReader可以指定編碼 String jdbcConValue = props.getProperty("jdbc_con"); System.out.println(jdbcConValue); System.out.println("加載src包下的資源------------------------"); path = "/WEB-INF/classes/com/test/servlet/jdbc_connection.properties"; realPath=getServletContext().getRealPath(path); System.out.println(realPath); reader = new InputStreamReader(new FileInputStream(realPath),"utf-8"); props.load(reader); //load個人建議還是用Reader來讀,因為reader體系中有個InputStreamReader可以指定編碼 jdbcConValue = props.getProperty("jdbc_con"); System.out.println("second::"+jdbcConValue); }

方式二:采用ResourceBundle類讀取配置信息,

優點是:可以以完全限定類名的方式加載資源后,直接的讀取出來,且可以在非Web應用中讀取資源文件。
缺點:只能加載類classes下面的資源文件,且只能讀取.properties文件。

    /** * 獲取指定.properties配置文件中所以的數據 * @param propertyName * 調用方式: * 1.配置文件放在resource源包下,不用加后綴 * PropertiesUtil.getAllMessage("message"); * 2.放在包里面的 * PropertiesUtil.getAllMessage("com.test.message"); * @return */ public static List<String> getAllMessage(String propertyName) { // 獲得資源包 ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim()); // 通過資源包拿到所有的key Enumeration<String> allKey = rb.getKeys(); // 遍歷key 得到 value List<String> valList = new ArrayList<String>(); while (allKey.hasMoreElements()) { String key = allKey.nextElement(); String value = (String) rb.getString(key); valList.add(value); } return valList; }

方式三:采用ClassLoader方式進行讀取配置信息

優點是:可以在非Web應用中讀取配置資源信息,可以讀取任意的資源文件信息。
缺點:只能加載類classes下面的資源文件。

    /**獲取的是classes路徑下的文件 * 優點是:可以在非Web應用中讀取配置資源信息,可以讀取任意的資源文件信息 * 缺點:只能加載類classes下面的資源文件。 * 如果要加上路徑的話:com/test/servlet/jdbc_connection.properties */ private static void use_classLoador(){ //獲取文件流 InputStream is=TestJava.class.getClassLoader().getResourceAsStream("message.properties"); //獲取文件的位置 String filePath=TestJava.class.getClassLoader().getResource("message.properties").getFile(); System.out.println(filePath); } 

修改Properties:

    /** * 傳遞鍵值對的Map,更新properties文件 * @param fileName * 文件名(放在resource源包目錄下),需要后綴 * @param keyValueMap * 鍵值對Map */ public static void updateProperties(String fileName, Map<String,String> keyValueMap) { //InputStream inputStream = // PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName); //輸入流 String filePath = PropertiesUtil.class.getClassLoader().getResource(fileName).getFile(); //文件的路徑 System.out.println("propertiesPath:" + filePath); Properties props = new Properties(); BufferedReader br = null; BufferedWriter bw = null; try { // 從輸入流中讀取屬性列表(鍵和元素對) br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath))); props.load(br); br.close(); // 寫入屬性文件 bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath))); props.clear();// 清空舊的文件 for (String key : keyValueMap.keySet()) props.setProperty(key, keyValueMap.get(key)); props.store(bw, ""); bw.close(); } catch (IOException e) { System.err.println("Visit " + filePath + " for updating value error"); } finally { try { br.close(); bw.close(); } catch (IOException e) { e.printStackTrace(); } } }

方法四:getResouceAsStream

XmlParserHandler.class.getResourceAsStream 與 classloader 的不同之處在於使用的是當前類的相對路徑。

BufferedReader br=new BufferedReader( new InputStreamReader( XmlParserHandler.class.getResourceAsStream("./rain.xml"), //./代表當前目錄不寫也可以 "GB2312" ) );

方法五:PropertiesLoaderUtils 工具類

Spring 提供的 PropertiesLoaderUtils 允許您直接通過基於類路徑的文件地址加載屬性資源。
最大的好處就是:實時加載配置文件,修改后立即生效,不必重啟。

    private static void springUtil(){ Properties props = new Properties(); while(true){ try { props=PropertiesLoaderUtils.loadAllProperties("message.properties"); for(Object key:props.keySet()){ System.out.print(key+":"); System.out.println(props.get(key)); } } catch (IOException e) { System.out.println(e.getMessage()); } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }

轉載自:https://www.jianshu.com/p/efdd1a526939


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM