本篇引用参考文章
一、Properties类
Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置。像Python支持的配置文件是.ini文件,同样,它也有自己读取配置文件的类ConfigParse,方便程序员或用户通过该类的方法来修改.ini配置文件。在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用”#”来注释。Properties继承自Hashtable。
二、Properties提供的几个主要方法:
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 (),清除所有装载的 键 - 值对。该方法在基类中提供。
三、Java读取Properties文件
Java读取Properties文件的方法有很多,详见参考: Java读取Properties文件的六种方法
但是最常用的还是通过java.lang.Class类的getResourceAsStream(String name)方法来实现,如下可以这样调用:
InputStream in = getClass().getResourceAsStream(“资源Name”);作为我们写程序的,用此一种足够。
或者下面这种也常用:
InputStream in = new BufferedInputStream(new FileInputStream(filepath));
实用案例
1、简单小demo
先建一个简单的配置文件(Test.properties)
注:properties文件可直接通过as在项目根目录创建Resource Bundle文件获得
name=VV
weight=111
height=222
再通过主程序执行
public class PropertiesClass {
public static void main(String[] args) throws FileNotFoundException, IOException {
Properties pps = new Properties();
pps.load(new FileInputStream("Test.properties"));
Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
while(enum1.hasMoreElements()) {
String strKey = (String) enum1.nextElement();
String strValue = pps.getProperty(strKey);
System.out.println(strKey + "=" + strValue);
}
}
}
2、一个比较综合的实例
根据key读取value
读取properties的全部信息
写入新的properties信息
//关于Properties类常用的操作
public class TestProperties {
//根据Key读取Value
public static String GetValueByKey(String filePath, String key) {
Properties pps = new Properties();
try {
InputStream in = new BufferedInputStream (new FileInputStream(filePath));
pps.load(in);
String value = pps.getProperty(key);
System.out.println(key + " = " + value);
return value;
}catch (IOException e) {
e.printStackTrace();
return null;
}
}
//读取Properties的全部信息
public static void GetAllProperties(String filePath) throws IOException {
Properties pps = new Properties();
InputStream in = new BufferedInputStream(new FileInputStream(filePath));
pps.load(in);
Enumeration en = pps.propertyNames(); //得到配置文件的名字
while(en.hasMoreElements()) {
String strKey = (String) en.nextElement();
String strValue = pps.getProperty(strKey);
System.out.println(strKey + "=" + strValue);
}
}
//写入Properties信息
public static void WriteProperties (String filePath, String pKey, String pValue) throws IOException {
Properties pps = new Properties();
InputStream in = new FileInputStream(filePath);
//从输入流中读取属性列表(键和元素对)
pps.load(in);
//调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。
//强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
OutputStream out = new FileOutputStream(filePath);
pps.setProperty(pKey, pValue);
//以适合使用 load 方法加载到 Properties 表中的格式,
//将此 Properties 表中的属性列表(键和元素对)写入输出流
pps.store(out, "Update " + pKey + " name");
}
public static void main(String [] args) throws IOException{
//String value = GetValueByKey("Test.properties", "name");
//System.out.println(value);
//GetAllProperties("Test.properties");
WriteProperties("Test.properties","long", "212");
}
}
3、一个综合性的读写配置文件完整实例(可加密)
public class MainActivity extends AppCompatActivity {
private Button btnSave;
public String data = "我是将要被保存到配置文件中的字符串!";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSave = (Button) findViewById(R.id.btn_save);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ConfigUtils.saveData(data);
}
});
}
}
public class ConfigUtils {
public static final String NAME_KEY = "name";
public static final String PROPERTIES_PATH = "/liuw/config.properties";
public static final String path = Environment.getExternalStorageDirectory().getAbsolutePath() + PROPERTIES_PATH;
public static void saveData(String data) {
String s = getValue(NAME_KEY, false);
if (s != null && s.equals(data)) {
return;
}
putValue(NAME_KEY, data, false);
}
/**
* 设置键值对
* @param key
* @param value
* @param needBase64
*/
public static void putValue(String key, String value, boolean needBase64) {
if (TextUtils.isEmpty(key)) {
return;
}
Properties proper = getProperties();
if (proper == null) {
return;
}
if (TextUtils.isEmpty(value)) {
proper.remove(key);
} else {
if (needBase64) {
value = new String(Base64.encode(value.getBytes(), Base64.DEFAULT));
}
proper.put(key,value);
}
saveProperties(proper);
}
private static void saveProperties(Properties proper) {
FileOutputStream out = null;
if (proper == null) {
return;
}
//创建文件
File file = new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
out = new FileOutputStream(file);
proper.store(out, "config");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static String getValue(String key, boolean needBase64) {
String value = null;
Properties proper = null;
if (TextUtils.isEmpty(key)) {
return null;
}
proper = getProperties();
if (proper == null) {
return null;
}
value = proper.getProperty(key);
if (!TextUtils.isEmpty(value)) {
if (needBase64) {
return new String(Base64.decode(value.getBytes(), Base64.DEFAULT));
} else {
return value;
}
}
return null;
}
/**
* 获取配置文件
* @return
*/
public static Properties getProperties() {
FileInputStream in = null;
Properties proper = null;
//创建文件
File file = new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//读取文件
proper = new Properties();
try {
in = new FileInputStream(file);
proper.load(in);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return proper;
}
}