一:介绍: properties文件在java开发中使用的比较多,主要是一些配置不但愿在程序中写死,而采用 properties文件这样在不一样的地方使用只须要修改properties文件而不用修改程序,最日常的 是使用在数据库配置中或信息配置中,在开发多语言版本的时候也颇有用处,你不一样的语言版本 使用不一样的配置文件,这样你就能够不修改程序也不用在程序中在判断,只须要把文件放在 不一样的地方就可使用。java
二:准备 使用properties文件你须要使用java.util.ResourceBundle充分了解,同时你须要把properties 文件放在classpath中,这样系统启动是才能加载文件。程序员
三:加载properties文件 ResourceBundle msgBundle=ResourceBundle.getBundle(msgResource,Locale.CHINA); 使用上面的语句你就能够加载properties文件文件了,但你必须保证properties 文件放 在classpath中。 同时请参考Java API java.util.ResourceBundle;web
四:使用properties 如今你须要取到properties文件中的内容,使用ResourceBundle里面的getString() 方法就能够了。 但须要注意的是getString取到的是ISO字符串,你可能根据须要转换为不一样的字符串。sql
jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=EVA_MEMBER
jdbc.username=sa
jdbc.password=sa数据库
import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;服务器
public class MessageBundle {jsp
private static ResourceBundle msgBundle = null; public MessageBundle(String msgResource) { msgBundle = ResourceBundle.getBundle(msgResource, Locale.CHINA); } public static String getMessage(String _key) { String message = null; try { message = new String(msgBundle.getString(_key) .getBytes("ISO8859_1"), "gb2312"); } catch (MissingResourceException ex) { ex.printStackTrace(); } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); } return message; } public static void main(String[] args) { MessageBundle msg=new MessageBundle("jdbc"); String driver = msg.getMessage("jdbc.driverClassName"); String url = msg.getMessage("jdbc.url"); String username =msg.getMessage("jdbc.username"); String password =msg.getMessage("jdbc.password"); System.out.println(driver); System.out.println(url); System.out.println(username); System.out.println(password); }
} 六:具体运用 1:)链接数据库 在jsp开发中一般链接数据库都是由JavaBean去实现,但你由不但愿下次使用这个javabean 去修改.这时候properties文件就颇有做用了。你能够把数据库配置放在properties文件中。 这样就能够只修改properties而继续使用JavaBean了。 2网页风格 建设一个网站一般是须要统一的风格,也就觉得着须要统一的背景色等等,这个时候你把 网页风格涉及的要素放在peoperties文件中,须要修改一次性修改几能够了,或者下次还 有大概相同的网站是否是能够省修改页面的时间啊。 3:)信息提示 在开发一个Appaction中出错提示或者信息提示是必须的,而不少时候你的提示信息,用户 未必能理解,一开始你又不知道如何用户能够理解,这个时候把全部的提示信息放在 properties文件中是一个不错的提示。 4:)和系统有关的属性 由于java是能够在不一样的平台上运行的,而不少时候开发和实际运行是在不一样的平台,这个函数
时候你就可使用properties文件保存系统属性,移植也能够省一些时间。sqlserver
Java读取Properties文件的六种方法网站
1.使用java.util.Properties类的load()方法
示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));
Properties p = new Properties();
p.load(in);
2。使用java.util.ResourceBundle类的getBundle()方法
示例: ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());
3。使用java.util.PropertyResourceBundle类的构造函数
示例: InputStream in = new BufferedInputStream(new FileInputStream(name));
ResourceBundle rb = new PropertyResourceBundle(in);
4。使用class变量的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
5。使用class.getClassLoader()所获得的java.lang.ClassLoader的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
6。使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法
示例: InputStream in = ClassLoader.getSystemResourceAsStream(name);
Properties p = new Properties();
p.load(in);
补充
Servlet中可使用javax.servlet.ServletContext的getResourceAsStream()方法
示例:InputStream in = context.getResourceAsStream(path);
Properties p = new Properties();
p.load(in);
JProperties.java文件
public class JProperties {
public final static int BY_PROPERTIES = 1;
public final static int BY_RESOURCEBUNDLE = 2;
public final static int BY_PROPERTYRESOURCEBUNDLE = 3;
public final static int BY_CLASS = 4;
public final static int BY_CLASSLOADER = 5;
public final static int BY_SYSTEM_CLASSLOADER = 6;
public final static Properties loadProperties(final String name, final int type) throws IOException {
Properties p = new Properties();
InputStream in = null;
if (type == BY_PROPERTIES) {
in = new BufferedInputStream(new FileInputStream(name));
assert (in != null);
p.load(in);
} else if (type == BY_RESOURCEBUNDLE) {
ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());
assert (rb != null);
p = new ResourceBundleAdapter(rb);
} else if (type == BY_PROPERTYRESOURCEBUNDLE) {
in = new BufferedInputStream(new FileInputStream(name));
assert (in != null);
ResourceBundle rb = new PropertyResourceBundle(in);
p = new ResourceBundleAdapter(rb);
} else if (type == BY_CLASS) {
assert (JProperties.class.equals(new JProperties().getClass()));
in = JProperties.class.getResourceAsStream(name);
assert (in != null);
p.load(in);
// return new JProperties().getClass().getResourceAsStream(name);
} else if (type == BY_CLASSLOADER) {
assert (JProperties.class.getClassLoader().equals(new JProperties().getClass().getClassLoader()));
in = JProperties.class.getClassLoader().getResourceAsStream(name);
assert (in != null);
p.load(in);
// return new JProperties().getClass().getClassLoader().getResourceAsStream(name);
} else if (type == BY_SYSTEM_CLASSLOADER) {
in = ClassLoader.getSystemResourceAsStream(name);
assert (in != null);
p.load(in);
}
if (in != null) {
in.close();
}
return p;
}
// ---------------------------------------------- servlet used
// ---------------------------------------------- support class
public static class ResourceBundleAdapter extends Properties {
public ResourceBundleAdapter(ResourceBundle rb) {
assert (rb instanceof java.util.PropertyResourceBundle);
this.rb = rb;
java.util.Enumeration e = rb.getKeys();
while (e.hasMoreElements()) {
Object o = e.nextElement();
this.put(o, rb.getObject((String) o));
}
}
private ResourceBundle rb = null;
public ResourceBundle getBundle(String baseName) {
return ResourceBundle.getBundle(baseName);
}
public ResourceBundle getBundle(String baseName, Locale locale) {
return ResourceBundle.getBundle(baseName, locale);
}
public ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader) {
return ResourceBundle.getBundle(baseName, locale, loader);
在咱们平时写程序的时候,有些参数是常常改变的,而这种改变不是咱们预知的。好比说咱们开发了一个操做数据库的模块,在开发的时候咱们链接本地的数据库那么 IP ,数据库名称,表名称,数据库主机等信息是咱们本地的,要使得这个操做数据的模块具备通用性,那么以上信息就不能写死在程序里。一般咱们的作法是用配置文件来解决。
各类语言都有本身所支持的配置文件类型。好比 Python ,他支持 .ini 文件。由于他内部有一个 ConfigParser 类来支持 .ini 文件的读写,根据该类提供的方法程序员能够自由的来操做 .ini 文件。而在 Java 中, Java 支持的是 .properties 文件的读写。JDK 内置的 java.util.Properties 类为咱们操做 .properties 文件提供了便利。
一. .properties 文件的形式 ==========================================================
dbPort = localhost
databaseName = mydb
dbUserName = root
dbPassword = root
dbTable = mytable
ip = 192.168.0.9
······
在上面的文件中咱们假设该文件名为: test.properties 文件。其中 # 开始的一行为注释信息;在等号“ = ”左边的咱们称之为key ;等号“ = ”右边的咱们称之为 value 。(其实就是咱们常说的键 - 值对) key 应该是咱们程序中的变量。而 value 是咱们根据实际状况配置的。 二. JDK 中的 Properties 类 Properties 类存在于胞 Java.util 中,该类继承自 Hashtable ,它提供了几个主要的方法: 1. getProperty ( String key) , 用指定的键在此属性列表中搜索属性。也就是经过参数 key ,获得 key 所对应的 value 。
2. load ( InputStream inStream) ,从输入流中读取属性列表(键和元素对)。经过对指定的文件(好比说上面的 test.properties 文件)进行装载来获取该文件中的全部键 - 值对。以供 getProperty ( String key) 来搜索。 3. setProperty ( String key, String value) ,调用 Hashtable 的方法 put 。他经过调用基类的put方法来设置 键 - 值对。
4. store ( OutputStream out, String comments) , 以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。与 load 方法相反,该方法将键 - 值对写入到指定的文件中去。
5. clear ()
,清除全部装载的 键 - 值对。该方法在基类中提供。
有了以上几个方法咱们就能够对 .properties 文件进行操做了!
简单实例:
Java代码 收藏代码 package cn.net.yans.common.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
/**
*/
public class Configuration {
private Properties propertie;
private FileInputStream inputFile;
private FileOutputStream outputFile;
/** * 初始化Configuration类 */ public Configuration() { propertie = new Properties(); } /** * 初始化Configuration类 * * @param filePath * 要读取的配置文件的路径+名称 */ public Configuration(String filePath) { propertie = new Properties(); try { inputFile = new FileInputStream(this.getClass().getClassLoader() .getResource(filePath).getPath()); propertie.load(inputFile); inputFile.close(); } catch (FileNotFoundException ex) { System.out.println("读取属性文件--->失败!- 缘由:文件路径错误或者文件不存在"); ex.printStackTrace(); } catch (IOException ex) { System.out.println("装载文件--->失败!"); ex.printStackTrace(); } }// end ReadConfigInfo(...) /** * 重载函数,获得key的值 * * @param key * 取得其值的键 * @return key的值 */ public String getValue(String key) { if (propertie.containsKey(key)) { String value = propertie.getProperty(key);// 获得某一属性的值 return value; } else return ""; }// end getValue(...) /** * 重载函数,获得key的值 * * @param fileName * properties文件的路径+文件名 * @param key * 取得其值的键 * @return key的值 */ public String getValue(String fileName, String key) { try { String value = ""; inputFile = new FileInputStream(fileName); propertie.load(inputFile); inputFile.close(); if (propertie.containsKey(key)) { value = propertie.getProperty(key); return value; } else return value; } catch (FileNotFoundException e) { e.printStackTrace(); return ""; } catch (IOException e) { e.printStackTrace(); return ""; } catch (Exception ex) { ex.printStackTrace(); return ""; } }// end getValue(...) /** * 清除properties文件中全部的key和其值 */ public void clear() { propertie.clear(); }// end clear(); /** * 改变或添加一个key的值,当key存在于properties文件中时该key的值被value所代替, 当key不存在时,该key的值是value * * @param key * 要存入的键 * @param value * 要存入的值 */ public void setValue(String key, String value) { propertie.setProperty(key, value); }// end setValue(...) /** * 将更改后的文件数据存入指定的文件中,该文件能够事先不存在。 * * @param fileName * 文件路径+文件名称 * @param description * 对该文件的描述 */ public void saveFile(String fileName, String description) { try { outputFile = new FileOutputStream(fileName); propertie.store(outputFile, description); outputFile.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } }// end saveFile(...) public static void main(String[] args) throws IOException { Configuration rc = new Configuration("powers.properties"); String[] powerList = rc.getValue("list").split(","); for (String po : powerList) { System.out.println(po); } }
}
路径相关问题:
在java中使用相对路径 无标题文档 ? 在开发过程当中,咱们常常会遇到读取配置文件的状况,对于配置文件的读取,根据环境等状况又各有不一样,通常状况下,若是从非jar包中使用相对/路径,比较简单,就不在累述了,而在不少 状况下,咱们须要把咱们的class打包成jar文件,进行使用,这时就会发现,咱们先前若是没有考虑到这些,可能就行不通了,那么,该如何解决呢?方法以下 : 有以下路径 : Web-info--|-->classes--->conf-->config.properties |-->lib 此时加入咱们须要读取config.properties,在不使用jar包时,使用以下方式读取,不失为一种方法: File f = new File(this.getClass().getResource("/").getPath()); f = new File(f.getPath() + "/conf/config.properties");
或者:(this.getClass().getClassLoader().getResource(fileName).getPath())
注:f.getPath()即为当class所在的绝对路径。如:c:\javasrc\web-inf\classes 而后,对文件对象进行处理,就能把配置信息读取出来了,可是加入如上class被打包成jar文件,那么,在程序执行到这里时,就会没法找到配置文件,那么该如何处理呢? 处理方法以下: String s_config="conf/config.properties"; InputStream in = ClassLoader.getSystemResourceAsStream(s_config); if( in == null ){ System.out.println( " 打开 " + s_config + "失败!" ); }else { Properties properties = new Properties(); properties.load(in); // //接下来就能够经过properties.getProperty(String obj)方法对进行配置信息读取了
System.getProperty ("user.dir" )当前用户目录的相对路径。
this.getClass().getResource("") 到的也是当前ClassPath 的绝对URI 路径。
ClassLoader.getSystemResource("") 到的也是当前ClassPath 的绝对URI 路径。
Thread.currentThread().getContextClassLoader().getResource("") 到的也是当前ClassPath 的绝对URI 路径。
读取Properties 文件的方法
使用java.util.Properties 类的load() 方法 示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name)); Properties p = new Properties(); p.load(in);
使用java.util.ResourceBundle 类的getBundle() 方法 示例: ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());
使用java.util.PropertyResourceBundle 类的构造函数 示例: InputStream in = new BufferedInputStream(new FileInputStream(name)); ResourceBundle rb = new PropertyResourceBundle(in);
使用class 变量的getResourceAsStream() 方法 示例: InputStream in = JProperties.class.getResourceAsStream(name); Properties p = new Properties(); p.load(in);
使用class.getClassLoader() 所获得的java.lang.ClassLoader 的getResourceAsStream() 方法。
示例:
InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name); Properties p = new Properties(); p.load(in);
7.Servlet 中可使用javax.servlet.ServletContext 的getResourceAsStream() 方法 示例: InputStream in = context.getResourceAsStream(path); Properties p = new Properties();
p.load(in);
空格
//得到文件路径,并对路径进行处理 private static String getUrl() { String path = configLoad.class.getResource("config.properties").toString(); path = path.replace("%20", " "); //引号中有一个半角的空格 path = path.substring(6); return path; } } 那么这里返回了一个Properties类型的值,在这里就可使用getProperty()来得到值 如:Properties pro = configLoad.getConfig(); String http = pro.getProperty("url").toString();
总 结:java的properties文件须要放到classpath下面,这样程序才能读取到,有关classpath实际上就是java类或者库的存放 路径,在java工程中,properties放到class文件一块。在web应用中,最简单的方法是放到web应用的WEB-INF/classes 目录下便可,也能够放在其余文件夹下面,这时候须要在设置classpath环境变量的时候,将这个文件夹路径加到classpath变量中,这样也也可 以读取到。在此,你须要对classpath有个深入理解,classpath绝非系统中刻意设定的那个系统环境变量,WEB-INF/classes其 实也是,java工程的class文件目录也是