`

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();
  }
}

上面的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文件,我们可以为不同地区的用户提供本地化的消息。 总结起来,Properties类是Java中处理配置文件的重要工具,它提供了丰富的API来读取、修改和保存键值对数据。无论是简单的应用程序配置...

    读取properties文件

    ### 读取Properties文件:Java中的配置管理利器 在Java编程中,`Properties`类是处理配置文件(通常为`.properties`格式)的关键工具。这种文件格式被广泛应用于存储应用程序的配置信息,如数据库连接字符串、邮件...

    java集合小结

    ### Java集合小结 #### 一、集合的概念与重要性 集合是Java编程语言中用于存储、管理和操作数据的一种重要工具。它提供了多种数据结构来适应不同的应用场景,从而有效地提高程序开发效率。从数据结构的角度来看,...

    java文件的加载

    #### 四、小结 通过上述介绍可以看出,在Java中加载文件的方式多种多样,开发者可以根据实际需求选择最适合的方法。无论是基于Java本身的类加载机制还是通过Spring等框架提供的便捷方式,都能够有效地实现资源文件...

    java的property配置文件的用法.txt

    在Java中,`.properties`文件是一种简单的键值对存储方式,其中键和值之间通过等号(`=`)分隔。此外,`#`符号用于标记注释行。例如: ``` # 以下为服务器、数据库信息 dbPort = localhost databaseName = mydb ...

    Java中文编码问题小结

    本文主要涵盖了Java处理中文字符编码的关键点,包括Java虚拟机(JVM)的初始配置、编译过程中的编码设置、文件读写操作、XML文件处理以及字符串与字节数组之间的转换。 首先,JVM在启动时会根据操作系统环境设定...

    IDEA使用properties配置文件进行mysql数据库连接的教程图解

    六、小结 本教程总结了使用IDEA中的properties配置文件连接mysql数据库的步骤。使用properties配置文件可以方便地管理mysql数据库的连接信息,并且可以方便地切换不同的数据库。 七、注意事项 在使用properties...

    Java课设:内有课程设计报告以及完整代码

    在Java中,可以使用Properties类来读取和写入这些配置信息,以实现灵活的配置和管理。 3. **对象序列化与反序列化**:对象序列化是将对象的状态转换为可存储或传输的形式,而反序列化则是相反的过程。在系统中,...

    Struts2学习小结

    ### Struts2学习小结 #### 一、Struts2简介及环境搭建 **Struts2** 是一款基于 **MVC**(Model-View-Controller)设计模式的开源框架,用于简化 Java Web 应用程序的开发过程。通过将业务逻辑、用户界面以及控制...

    java基础案例与开发详解案例源码全

    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 ...

    JAVA环境变量配置

    **小结:** Tomcat作为一款轻量级的Java应用服务器,是Java Web应用程序的常用部署平台之一。通过简单的解压安装即可使用,对于初学者来说非常友好。 #### 四、创建与管理项目 **1. 创建新项目** - 在MyEclipse中...

    java范例开发大全源代码

     实例127 一个文件变成多个小文件 178  实例128 多个小文件合成一个文件 181  实例129 统计指定文件中的字符个数 183  实例130 对象的序列化与反序列化 185  实例131 同时显示多个文件 187  实例132...

    java范例开发大全

    实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载...

    Java范例开发大全 (源程序)

     实例221 改变Properties文件中的键值 399  第13章 多线程编程(教学视频:121分钟) 405  13.1 多线程的五种基本状态 405  实例222 启动线程 405  实例223 参赛者的比赛生活(线程休眠唤醒) 407  实例...

    浅谈常用Java数据库连接池(小结)

    c3p0 是一个功能强大且灵活的数据库连接池,可以通过 API 方式配置,也可以通过文件的方式进行配置,配置文件有两种形式:properties 或 xml 文件。 5. 连接池的实现 连接池的实现需要加载 JDBC 驱动程序。在 Java...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    **3.6 课后小结** 本章主要讲解了Java反射机制的基本概念、使用方法和应用场景,强调了其灵活性和在框架设计中的重要性。 **3.7 课后习题** 设计习题,让学习者通过实践加深对反射的理解,如编写一个工具类,动态...

    hibernate小结

    HibernateUtil通常包含对数据库的增删改查操作,如增加、删除、更新、查询单个对象、查询所有对象和分页查询。在进行写操作时,需要开启事务,并在操作完成后提交或回滚。 【Hibernate对象的三种状态】 1. 瞬态...

Global site tag (gtag.js) - Google Analytics