Java对Properties文件操作小结

经常用到,Java对Properties文件操作,在这里做一个小结。
Java对Properties文件的操作可以说是“不尽人意”,这里时间关系大体先说一下,回头慢慢说。
1.java读Properties文件,经常能读出一些乱码。
2.java写Properties文件,用能把以前的Properties文件的注释弄丢了。


//读配置文件片段

public String getPropertyValue(String key){
Properties pro = new Properties();
try {
InputStream in = new FileInputStream(""); //加载配置文件
try {
pro.load(in);
} finally {
in.close();
}
return pro.getProperty(key);
} catch (Exception e) {
e.printStackTrace();

return null;
}

}



//写配置文件片段

public void setPropertyValue(String key, String value){
Properties pro = new Properties();
try {
InputStream in = new FileInputStream(""); //加载配置文件
try {
pro.load(in);
} finally {
in.close();
}

pro.setProperty(key, value);

OutputStream out =new FileOutputStream(""); //加载配置文件
try{
pro.store(out, "modi by lmy");
out.flush();
}finally{
out.close();
}

} catch (Exception e) {
e.printStackTrace();
}
}

上面的[b]public String getPropertyValue(String key)[/b]是不存在什么问题的,因为毕竟就是一个读取操作,但是[b]public void setPropertyValue(String key, String value)[/b]会出现很严重的问题,因为它会把你文件中所有的注释都忽略掉,你保存文件后发现所有的注释都没有了,解决这个问题我找了好多资料,没有什么好办法。最好利用了一个笨办法,就是写入操作不用Properties类机型操作,而是直接利用文件写入,逐行读入文件,然后后利用key来替换key对应的value。

这里给大家一个完整的代码,大体方法如此,具体的方法大家手动根据自己的需要去改吧。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.swing.table.TableModel;

import com.peraglobal.core.AnalyserMap;

public class PropertyTool {

private static Object[][] content;

public final static void setProperty(Properties pro) {

List<String> keys = new ArrayList<String>();
List<String> values = new ArrayList<String>();
content = null;

Iterator<Map.Entry<Object, Object>> it = pro.entrySet().iterator();
String tempValue = "";
Object key;
Object value;
while (it.hasNext()) {
Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) it
.next();
// Object key = entry.getKey();
key = entry.getKey();
value = entry.getValue();
keys.add(String.valueOf(key));
try {
tempValue = new String(String.valueOf(value).getBytes(
"iso-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
values.add(tempValue);
}

content = new Object[keys.size()][2];
for (int i = 0; i < keys.size(); i++) {
content[i][0] = keys.get(i);
content[i][1] = values.get(i);
}
}

public final static List<String> getProperties(String filePath) {
try {
// 加载配置文件
List<String> propCont = new ArrayList<String>();
FileInputStream fis = new FileInputStream(filePath);
InputStreamReader isr = new InputStreamReader(fis, "utf-8");
BufferedReader bufferedreader = new BufferedReader(isr);
String temp = "";
while ((temp = bufferedreader.readLine()) != null) {
propCont.add(temp);
}
bufferedreader.close();
isr.close();
fis.close();

return propCont;

} catch (Exception e) {
e.printStackTrace();
return null;
}
}

public final static void saveProperties(String filePath,
List<String> content, TableModel tableValues) {
try {
// 加载配置文件
FileReader file = new FileReader(filePath);
List<String> propCont = new ArrayList<String>();
BufferedReader bufferedreader = new BufferedReader(
new InputStreamReader(new FileInputStream(filePath),
"utf-8"));
String temp = "";
while ((temp = bufferedreader.readLine()) != null) {
propCont.add(temp);
}

propCont = tableValutToList(propCont, tableValues);

bufferedreader.close();
file.close();

BufferedWriter br = null;
OutputStream outsm = new FileOutputStream(filePath);
OutputStreamWriter outFileWriter = new OutputStreamWriter(outsm,
"utf-8");
br = new BufferedWriter(outFileWriter);

br.write(listToString(propCont));
br.flush();
outFileWriter.flush();
outsm.flush();

br.close();
outFileWriter.close();
outsm.close();

} catch (Exception e) {
e.printStackTrace();
}
}

public static final List<String> tableValutToList(List<String> content,
TableModel tableValues) {
String keyCell;
String valueCell;
String rowContent;
String[] cellContents;
String newContent;
// 以原始的文档为依据开始遍历。
for (int i = 0; i < content.size(); i++) {
rowContent = content.get(i);
// 遍历修改后的数据
for (int j = 0; j < tableValues.getRowCount(); j++) {
keyCell = String.valueOf(tableValues.getValueAt(j, 1));
valueCell = String.valueOf(tableValues.getValueAt(j, 3));
// 找到原始文件相应的值,并覆盖。
if (0 <= rowContent.indexOf(keyCell)) {
cellContents = rowContent.split("=");
// 判断是否合法,不合法则跳出循环(可能需要更严格的判断,来判断是否是注释等)。
if (0 < cellContents.length
&& !cellContents[0].startsWith("#")
&& keyCell.trim().toLowerCase().equals(cellContents[0].trim().toLowerCase())) {
newContent = cellContents[0] + "=" + valueCell;
content.set(i, newContent);
}
}
}
}
return content;
}

public static final String listToString(List<String> list) {
String str = "";
for (int i = 0; i < list.size(); i++) {
str = str + list.get(i) + "\n";
}
return str;
}

/**
* 读取配置文件字段。
*
* @throws Exception
* */
public final static Object[][] loadProperty(String filePath,
AnalyserMap analyserMap) throws Exception {
Properties pro = new Properties();

File curFile = new File(filePath);
if (!curFile.exists()) {
throw new Exception("文件不存在");
}
// 加载配置文件
InputStream in = new FileInputStream(filePath);
try {
pro.load(in);
} finally {
in.close();
}

PropertyTool.setProperty(pro);
Object[][] content = PropertyTool.getProperties();

Object[] temptt;
List<Object[]> contentList = new ArrayList<Object[]>();
String key;
String value;
for (int i = 0; i < content.length; i++) {
key = String.valueOf(content[i][0]);
value = String.valueOf(content[i][1]);

if (!analyserMap.isVisible(key)) {
continue;
}

temptt = new Object[4];
temptt[0] = (i + 1) + "";
temptt[1] = key;
temptt[2] = analyserMap.getCaption(key);
temptt[3] = value;

contentList.add(temptt);
}

Object[][] reContent = new Object[contentList.size()][];
for (int i = 0; i < reContent.length; i++) {
temptt = contentList.get(i);
reContent[i] = temptt;
reContent[i][0] = i + 1 + "";

}

return reContent;
}

/**
* 读取配置文件字段。
*
* @throws Exception
* */
public final static Object[][] loadProperty(String filePath)
throws Exception {
Properties pro = new Properties();

File curFile = new File(filePath);
if (!curFile.exists()) {
throw new Exception("文件不存在");
}
// 加载配置文件
InputStream in = new FileInputStream(filePath);
try {
pro.load(in);
} finally {
in.close();
}

PropertyTool.setProperty(pro);
Object[][] content = PropertyTool.getProperties();

Object[] temptt;
List<Object[]> contentList = new ArrayList<Object[]>();
String key;
String value;
for (int i = 0; i < content.length; i++) {
key = String.valueOf(content[i][0]);
value = String.valueOf(content[i][1]);

temptt = new Object[2];
temptt[0] = key;
temptt[1] = value;

contentList.add(temptt);
}

Object[][] reContent = new Object[contentList.size()][];
for (int i = 0; i < reContent.length; i++) {
temptt = contentList.get(i);
reContent[i] = temptt;
}

return reContent;
}

public final static Object[][] getProperties() {
return content;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值