`
xutao5641745
  • 浏览: 226748 次
  • 性别: Icon_minigender_1
  • 来自: 汨罗
社区版块
存档分类
最新评论
阅读更多

不多说,直接上代码

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 具有按文件顺序加载功能。
 * 
 * @author shooter
 * 
 */
public class OrderProperties {
	private static final long serialVersionUID = 8380510196573353417L;

	private List<String> keys = new ArrayList<String>(); // 键,通过此List实现属性文件顺序读取

	private Map<String, String> valueMap = new HashMap<String, String>(); // 存储属性文件值

	/**
	 * 通过键获取值
	 * 
	 * @param key
	 * @return
	 */
	public String getProperty(String key) {
		return valueMap.get(key);
	}

	// for example, java regex
	public List<String> getKeys(String keyPattern) {
		Pattern pat = Pattern.compile(keyPattern);
		List<String> kl = new ArrayList<String>();
		for (String k : keys) {
			if (pat.matcher(k).matches()) {
				kl.add(k);
			}
		}
		return kl;
	}

	/**
	 * 添加元素
	 * 
	 * @param fileName
	 * @param line
	 * @throws IOException
	 */
	public synchronized void put(String fileName, String line)
			throws IOException {
		// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
		FileWriter writer = new FileWriter(fileName, true);
		writer.write("\n" + line);
		writer.flush();
		writer.close();
	}

	/**
	 * 修改元素
	 * 
	 * @param fileName
	 * @param key
	 * @param value
	 * @throws IOException
	 */
	public synchronized void update(String fileName, String[] key,
			String[] value) throws IOException {
		try {
			BufferedInputStream bin = new BufferedInputStream(
					new FileInputStream(fileName));
			byte[] buff = new byte[(int) bin.available()];
			bin.read(buff);
			FileOutputStream fout = new FileOutputStream(fileName);
			String str = new String(buff);
			String[] lines = str.split("\n");
			int j = 0;
			for (String line : lines) {
				for (int i = 0; i < key.length; i++) {
					if (key[i].equals(line.split("=")[0])) {
						line = value[i];
						break;
					}

				}
				String newLine = "\n";
				if (j == (lines.length - 1)) {
					newLine = "";
				}
				fout.write((line + newLine).getBytes());
				j++;
			}
			fout.flush();
			fout.close();
			bin.close();
		} catch (IOException e) {

		}
	}

	/**
	 * 加载,获得所有
	 * 
	 * @param fileName
	 * @throws IOException
	 */
	public synchronized void load(String fileName) throws IOException {
		BufferedReader bread = new BufferedReader(new InputStreamReader(
				new FileInputStream(fileName)));
		List<String> lines = new ArrayList<String>();
		String line = null;
		while ((line = bread.readLine()) != null) {
			line = line.trim();
			if (line.equals(""))
				continue;
			if (line.endsWith("\\"))
				line = line.substring(0, line.length() - 1); // compatible to
																// properties
																// file: end \
			if (line.indexOf('=') != -1) {
				lines.add(line);
			} else {
				String s = lines.get(lines.size() - 1);
				s += line;
				lines.set(lines.size() - 1, s);
			}
		}
		// parse key-value
		for (String l : lines) {
			String k = l.substring(0, l.indexOf("=")).trim();
			String v = l.substring(l.indexOf("=") + 1).trim();
			keys.add(k);
			valueMap.put(k, v);
		}
		bread.close();
	}

	/**
	 * 获得所有key
	 * 
	 * @return
	 */
	public List<String> getKeys() {
		return keys;
	}

	/**
	 * 中文乱码时用
	 * 
	 * @param dataStr
	 * @return
	 */
	public static String Unicode2GBK(String dataStr) {
		int index = 0;
		StringBuffer buffer = new StringBuffer();
		while (index < dataStr.length()) {
			if (!"\\u".equals(dataStr.substring(index, index + 2))) {
				buffer.append(dataStr.charAt(index));
				index++;
				continue;
			}
			String charStr = "";
			charStr = dataStr.substring(index + 2, index + 6);
			char letter = (char) Integer.parseInt(charStr, 16);
			try {
				buffer.append(new String((letter + "").getBytes("gbk"), "gbk"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			index += 6;
		}
		return buffer.toString();
	}

	@Override
	public String toString() {
		return valueMap.toString();
	}

	public static void main(String[] args) {
		OrderProperties prop = new OrderProperties();// 属性集合
		String path = "D:/Test/webapp/WEB-INF/conf/filterMethodArgs.properties";
		// 1.加载属性文件
		try {
			prop.load(path);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		//2.添加元素
		prop.put(path, "我是值");

		// 3.修改元素
		prop.update(path, new String[] { "我是键" }, new String[] { "我是值" });
	}
}
 
分享到:
评论

相关推荐

    LabVIEW按修改时间读取文件夹下文件.rar

    在这个场景中,我们需要使用到“打开文件”、“读取文件属性”等函数,特别是“读取文件属性”中的“获取文件修改日期/时间”功能,来获取每个文件的最后修改时间戳。 2. 文件夹遍历:使用“列出文件或目录”函数,...

    c++读写.ply文件

    读取`.ply`文件时,你需要逐行解析头信息,获取文件中包含的元素和属性信息。C++中,可以使用标准输入流`std::ifstream`打开文件,并通过`std::getline`函数逐行读取。然后使用字符串处理函数如`std::istringstream`...

    C#读取dbf文件(文件流方式)

    然后按照字段顺序读取每个字段的数据。 ```csharp for (int i = 0; i ; i++) { byte deleteFlag = reader.ReadByte(); if (deleteFlag != 255) { foreach (var field in fields) // fields是之前解析出的字段...

    Java Properties 解决中文乱码和顺序读写.docx

    确保IDE(如IntelliJ IDEA或Eclipse)设置文件编码为UTF-8,同时在读取Properties文件时,通过`InputStreamReader`指定正确的字符集,例如`UTF-8`,避免乱码出现。 例如,以下是一个简单的示例,演示如何读取包含...

    文件时间修改器更新文件时间修改文件属性

    这可能出于各种原因,比如恢复误删文件的原始时间戳,或者按照特定顺序整理文件。"文件时间修改器"就是这样一个工具,它能够帮助用户便捷地修改文件的这些时间属性。 创建时间、修改时间和访问时间是文件的三个主要...

    java Apache poi 对word doc文件进行读写操作

    在实际应用中,Apache POI 的功能不仅限于简单的读写操作,还支持复杂的格式转换、样式调整和模板填充等功能,是 Java 开发者处理 Word 文件的强大工具。然而,需要注意的是,由于 `.doc` 文件格式的复杂性,处理...

    SpringBoot-2.7.6读取配置文件的方式

    配置文件加载顺序 配置文件的加载遵循以下优先级(从高到低): 1. 命令行参数(`--key=value`) 2. `spring.config.location`指定的文件 3. `@SpringBootTest`注解中的`value`属性 4. 环境变量 5. 系统属性(`...

    shp文件的读写(含lib版和代码版)

    这种文件通常与`.dbf`文件一起使用,`.dbf`文件存储了与几何数据相关的属性信息。在本篇中,我们将深入探讨如何读取和写入`SHP`文件,包括使用库(lib版)和自编码实现(代码版)的方式。 ### 1. 使用库进行SHP文件...

    C#读取多个BIN文件并拼接

    它能够以指定的编码读取字符串,并且可以处理大端或小端字节顺序的系统。在我们的场景中,我们使用`BinaryReader`来逐个读取每个BIN文件的字节。 以下是实现这个功能的基本步骤: 1. **打开文件**:使用`...

    GeoTIFF图像文件的数据存储格式及读写

    1. **读取文件头**:解析文件头信息,确定文件的字节顺序。 2. **读取IFD**:根据IFD的偏移量读取IFD中的条目,获取图像的基本属性和其他元数据。 3. **解析GeoTag**:找到并解析GeoTag中的地理信息。 4. **读取图像...

    文件的属性时间修改器

    这有助于跟踪文件的使用情况,但频繁的访问可能会影响文件的显示顺序,如在某些文件管理器中。 3. **最后修改时间**:这个时间戳反映了文件内容最后一次被修改的时间。对于版本控制和协同编辑的文档来说,这是一个...

    struts2配置文件加载顺序

    3. **struts.properties**:这是一个属性文件,通常位于项目的类路径根目录下,用于配置全局属性,比如常量定义、错误页面等。 4. **struts.xml**:这是用户自定义的主配置文件,用于定义Action、结果类型、拦截器...

    从文件夹里读取图片文件排序效果

    FSO 提供了多种方法和属性来处理文件和目录,如创建、删除、复制文件和文件夹等。 #### 关键方法与属性: - **GetFolder(path)**:返回指定路径的文件夹对象。 - **files**:文件夹对象的一个属性,返回该文件夹下...

    用C读取DXF文件_c_cad_读取DXFC语言_c++dxf_读取DXF_

    例如,你可以创建一个Layer类来表示DXF文件中的层,其中包含颜色、线型等属性,以及一个Entity类作为基类,然后为每种几何实体创建子类(如Line、Circle、Arc等)。 为了进一步提高代码的可维护性和效率,可以考虑...

    Spring Boot多模块配置文件读取

    - 配置文件的加载顺序为:`application.properties`/`application.yml` &gt; `{profile}-application.properties`/`{profile}-application.yml`。 4. **使用@ConfigurationProperties绑定配置** - Spring Boot提供了...

    照片文件时间属性修改

    在IT领域,照片文件的时间属性修改是一个常见的需求,特别是在整理照片库、保护隐私或调整拍摄顺序时。这个过程涉及到文件的元数据,尤其是创建时间、修改时间和访问时间这三种主要的时间戳。 创建时间是文件首次被...

    6文件组织与文件格式.pptx

    顺序有序文件是记录按其主关键字有序的顺序文件,而顺序无序文件是记录未按其主关键字有序排列的顺序文件。 顺序文件的处理方式包括批处理和顺序查找法。顺序查找法即顺序扫描文件,按记录的主关键字逐个查找。顺序...

    10. 文件读写.docx

    - **二进制文件(无格式文件)**:同样支持顺序读取和直接读取。顺序读取会在记录前后添加额外的字节以表示记录长度;直接读取对文件大小没有限制,通常用于较大的文件。 - **流文件**:非常便捷且功能强大,通常...

    读取xlsx文件的C库

    本主题关注的是如何使用C库来读取Microsoft Excel 2007及更高版本的.xlsx文件,这些文件是基于Open XML标准的。在不依赖于微软提供的库或组件的情况下,我们可以借助开源库libxml2来实现这一目标。 首先,xlsx文件...

    dxf格式文件读取源码

    DXF文件由一系列的记录组成,这些记录按照特定的顺序排列,包括头信息、层定义、线型定义、实体数据等。源码将需要解析这些记录来提取图形信息。 2. **VC++编程环境**: VC++是Microsoft开发的一个集成开发环境...

Global site tag (gtag.js) - Google Analytics