经常用到,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();
}
}
上面的
public String getPropertyValue(String key)是不存在什么问题的,因为毕竟就是一个读取操作,但是
public void setPropertyValue(String key, String value)会出现很严重的问题,因为它会把你文件中所有的注释都忽略掉,你保存文件后发现所有的注释都没有了,解决这个问题我找了好多资料,没有什么好办法。最好利用了一个笨办法,就是写入操作不用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;
}
}
分享到:
相关推荐
通过不同语言的.properties文件,我们可以为不同地区的用户提供本地化的消息。 总结起来,Properties类是Java中处理配置文件的重要工具,它提供了丰富的API来读取、修改和保存键值对数据。无论是简单的应用程序配置...
### 读取Properties文件:Java中的配置管理利器 在Java编程中,`Properties`类是处理配置文件(通常为`.properties`格式)的关键工具。这种文件格式被广泛应用于存储应用程序的配置信息,如数据库连接字符串、邮件...
### Java集合小结 #### 一、集合的概念与重要性 集合是Java编程语言中用于存储、管理和操作数据的一种重要工具。它提供了多种数据结构来适应不同的应用场景,从而有效地提高程序开发效率。从数据结构的角度来看,...
#### 四、小结 通过上述介绍可以看出,在Java中加载文件的方式多种多样,开发者可以根据实际需求选择最适合的方法。无论是基于Java本身的类加载机制还是通过Spring等框架提供的便捷方式,都能够有效地实现资源文件...
在Java中,`.properties`文件是一种简单的键值对存储方式,其中键和值之间通过等号(`=`)分隔。此外,`#`符号用于标记注释行。例如: ``` # 以下为服务器、数据库信息 dbPort = localhost databaseName = mydb ...
本文主要涵盖了Java处理中文字符编码的关键点,包括Java虚拟机(JVM)的初始配置、编译过程中的编码设置、文件读写操作、XML文件处理以及字符串与字节数组之间的转换。 首先,JVM在启动时会根据操作系统环境设定...
六、小结 本教程总结了使用IDEA中的properties配置文件连接mysql数据库的步骤。使用properties配置文件可以方便地管理mysql数据库的连接信息,并且可以方便地切换不同的数据库。 七、注意事项 在使用properties...
在Java中,可以使用Properties类来读取和写入这些配置信息,以实现灵活的配置和管理。 3. **对象序列化与反序列化**:对象序列化是将对象的状态转换为可存储或传输的形式,而反序列化则是相反的过程。在系统中,...
13.1.2 Java对文件和目录的操作328 13.2 JavaIO原理332 13.3 流类结构333 13.3.1 InputStream和OutputStream333 13.3.2 Reader和Writer334 13.4 文件流336 13.4.1 FileInputStream和FileOutputStream336 13.4.2 ...
**小结:** Tomcat作为一款轻量级的Java应用服务器,是Java Web应用程序的常用部署平台之一。通过简单的解压安装即可使用,对于初学者来说非常友好。 #### 四、创建与管理项目 **1. 创建新项目** - 在MyEclipse中...
实例127 一个文件变成多个小文件 178 实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131 同时显示多个文件 187 实例132...
实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载...
实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例...
c3p0 是一个功能强大且灵活的数据库连接池,可以通过 API 方式配置,也可以通过文件的方式进行配置,配置文件有两种形式:properties 或 xml 文件。 5. 连接池的实现 连接池的实现需要加载 JDBC 驱动程序。在 Java...
**3.6 课后小结** 本章主要讲解了Java反射机制的基本概念、使用方法和应用场景,强调了其灵活性和在框架设计中的重要性。 **3.7 课后习题** 设计习题,让学习者通过实践加深对反射的理解,如编写一个工具类,动态...
HibernateUtil通常包含对数据库的增删改查操作,如增加、删除、更新、查询单个对象、查询所有对象和分页查询。在进行写操作时,需要开启事务,并在操作完成后提交或回滚。 【Hibernate对象的三种状态】 1. 瞬态...