자바 작업 properties 파일 의 영구적 인 키 쌍 과 주석 파일

12948 단어 properties
properties 파일 은 응용 시스템 에서 오래 사용 되 고 properties 파일 을 쓰 거나 properties 파일 을 불 러 오 는 것 도 간단 하고 자주 사용 하 는 방법 입 니 다.
지속 적 인 키 값 은 Properties 류 에 store 몇 가지 방법 을 제공 합 니 다.그 중에서 첫 줄 에 만 설명 을 추가 할 수 있 고 이전에 쓴 주석 도 잃 어 버 리 고 중국 어 를 지원 하지 않 습 니 다.
따라서 코드 를 개선 하고 중국어 주석 에 대한 지원 과 지속 화 과정 에서 주 해 를 잃 지 않 으 며 더 이상 말 하지 않 고 코드 를 올 립 니 다.
package com.zohan.www.util;

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.IOException;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * @ClassName: Properties
 * @Description:   Properties                   
 * @author zohan [email protected]
 * @date 2012-10-24   10:31:54
 * @version 0.1.1              
 * 
 */
public class Properties extends java.util.Properties {
	/**       */
	private String filePath = null;
	/**        */
	private String referFile = null;

	/**
	 *         key\value
	 */
	private Map<String, String> map = new HashMap<String, String>();

	/**
	 * @Fields serialVersionUID :(              )
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * @throws IOException
	 * @Title: load
	 * @Description:   load  ,
	 * @param file
	 *                
	 * @return void     
	 * @throws
	 */
	public void load(File file) throws IOException {
		if (null != file)
			this.filePath = file.getPath();
		FileInputStream fis = new FileInputStream(file);
		super.load(fis);
		fis.close();

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.util.Properties#getProperty(java.lang.String)
	 */
	@Override
	public String getProperty(String key) {
		String value = map.get(key);
		return null == value ? super.getProperty(key) : value;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.util.Properties#setProperty(java.lang.String, java.lang.String)
	 */
	@Override
	public synchronized Object setProperty(String key, String value) {
		return map.put(key, value);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.util.Properties#stringPropertyNames()
	 */
	@Override
	public Set<String> stringPropertyNames() {
		return super.stringPropertyNames();
	}

	/**
	 * 
	 * @Title: store
	 * @Description:       ,             public void load(File file)   
	 * @param target
	 * @param comments
	 * @throws Exception
	 *                 
	 * @return void     
	 * @throws
	 */
	public void store(String target, String comments) throws Exception {
		// filePath       
		File inFile = null;
		String temp = System.getProperty("java.io.tmpdir");
		temp = temp.endsWith(File.separator) ? temp : temp
				.concat(File.separator);
		if (!StringUtils.isEmpty(filePath)) {
			inFile = new File(filePath);
			if (inFile.exists()) {
				referFile = temp.concat(inFile.getName());
			}
		}

		inFile = new File(filePath);
		// filePath  null targetFile         
		if (StringUtils.isEmpty(filePath) && !inFile.exists()) {
			throw new Exception("        ");
		}
		// referFile     target      
		if (StringUtils.isEmpty(referFile)) {
			referFile = temp.concat(inFile.getName());
		}
		FileUtils.copyFile(inFile, new File(referFile));
		store0(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
				target), "utf-8")), comments, true);
		new File(referFile).delete();
	}

	/**
	 * 
	 * @Title: store0
	 * @Description:            ,        
	 * @param @param bw
	 * @param @param comments
	 * @param @param escUnicode
	 * @param @throws IOException     
	 * @return void     
	 * @throws
	 */
	private void store0(BufferedWriter bw, String comments, boolean escUnicode)
			throws IOException {
		if (comments != null) {
			writeComments(bw, comments);
		}
		bw.write("#" + new Date().toString());
		bw.newLine();
		synchronized (this) {
			Map<String, String> temp = new HashMap<String, String>();
			for (Enumeration e = keys(); e.hasMoreElements();) {
				String key = (String) e.nextElement();
				String val = (String) get(key);
				temp.put(key, val);
			}
			for (String key : map.keySet()) {
				temp.put(key, map.get(key));
			}
			BufferedReader br = new BufferedReader(new FileReader(referFile));
			String line = "";
			while ((line = br.readLine()) != null) {
				if (line.length() == 0) {
					bw.newLine();
				} else if (line.trim().startsWith("#")) {
					writeCommentsLine(bw, line);
				} else {
					//   key(^[^=]*(\\=)?[^=]*)=
					Pattern p = Pattern.compile("(^[^=]*)=");
					Matcher m = p.matcher(line.replaceAll("\\\\=", "ab"));
					String key = "";
					if (m.find()) {
						key = m.group(1);
						key = line.substring(0, key.length());
					}
					key = key.replaceAll("\\\\=", "=");
					String value = temp.remove(key.trim());
					if (StringUtils.isEmpty(value)) {
						String v = line.replace(key, "");
						if (StringUtils.isEmpty(v)) {
							value = "";
						} else {
							if (v.trim().startsWith("=")) {
								value = v.substring(1);
							} else {
								value = temp.get(key);
							}
						}
					}
					key = saveConvert(key.trim(), true, escUnicode);
					/*
					 * No need to escape embedded and trailing spaces for value,
					 * hence pass false to flag.
					 */
					value = saveConvert(value.trim(), false, escUnicode);
					bw.write(key + "=" + value);
					bw.newLine();
				}
			}
			br.close();

			for (String key : temp.keySet()) {
				String value = map.get(key);
				key = saveConvert(key.trim(), true, escUnicode);
				if (!StringUtils.isEmpty(value)) {
					value = saveConvert(value.trim(), false, escUnicode);
				} else {
					value = "";
				}
				bw.write(key + "=" + value);
				bw.newLine();

			}

		}
		bw.flush();

	}

	/*
	 * Converts unicodes to encoded &#92;uxxxx and escapes special characters
	 * with a preceding slash
	 */
	private String saveConvert(String theString, boolean escapeSpace,
			boolean escapeUnicode) {
		int len = theString.length();
		int bufLen = len * 2;
		if (bufLen < 0) {
			bufLen = Integer.MAX_VALUE;
		}
		StringBuffer outBuffer = new StringBuffer(bufLen);

		for (int x = 0; x < len; x++) {
			char aChar = theString.charAt(x);
			// Handle common case first, selecting largest block that
			// avoids the specials below
			if ((aChar > 61) && (aChar < 127)) {
				if (aChar == '\\') {
					outBuffer.append('\\');
					outBuffer.append('\\');
					continue;
				}
				outBuffer.append(aChar);
				continue;
			}
			switch (aChar) {
			case ' ':
				if (x == 0 || escapeSpace)
					outBuffer.append('\\');
				outBuffer.append(' ');
				break;
			case '\t':
				outBuffer.append('\\');
				outBuffer.append('t');
				break;
			case '
': outBuffer.append('\\'); outBuffer.append('n'); break; case '\r': outBuffer.append('\\'); outBuffer.append('r'); break; case '\f': outBuffer.append('\\'); outBuffer.append('f'); break; case '=': // Fall through case ':': // Fall through case '#': // Fall through case '!': outBuffer.append('\\'); outBuffer.append(aChar); break; default: if (((aChar < 0x0020) || (aChar > 0x007e)) & escapeUnicode) { outBuffer.append('\\'); outBuffer.append('u'); outBuffer.append(toHex((aChar >> 12) & 0xF)); outBuffer.append(toHex((aChar >> 8) & 0xF)); outBuffer.append(toHex((aChar >> 4) & 0xF)); outBuffer.append(toHex(aChar & 0xF)); } else { outBuffer.append(aChar); } } } return outBuffer.toString(); } /** * Convert a nibble to a hex character * * @param nibble * the nibble to convert. */ private static char toHex(int nibble) { return hexDigit[(nibble & 0xF)]; } /** A table of hex digits */ private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /** * * @Title: writeCommentsLine * @Description: * @param @param bw * @param @param comments * @param @throws IOException * @return void * @throws */ private static void writeCommentsLine(BufferedWriter bw, String comments) throws IOException { bw.write(comments); bw.newLine(); } /** * * @Title: writeComments * @Description: * @param @param bw * @param @param comments * @param @throws IOException * @return void * @throws */ private static void writeComments(BufferedWriter bw, String comments) throws IOException { bw.write("#"); int len = comments.length(); int current = 0; int last = 0; char[] uu = new char[6]; uu[0] = '\\'; uu[1] = 'u'; while (current < len) { char c = comments.charAt(current); if (c > '\u00ff' || c == '
' || c == '\r') { if (last != current) bw.write(comments.substring(last, current)); if (c > '\u00ff') { uu[2] = toHex((c >> 12) & 0xf); uu[3] = toHex((c >> 8) & 0xf); uu[4] = toHex((c >> 4) & 0xf); uu[5] = toHex(c & 0xf); bw.write(new String(uu)); } else { bw.newLine(); if (c == '\r' && current != len - 1 && comments.charAt(current + 1) == '
') { current++; } if (current == len - 1 || (comments.charAt(current + 1) != '#' && comments .charAt(current + 1) != '!')) bw.write("#"); } last = current + 1; } current++; } if (last != current) bw.write(comments.substring(last, current)); bw.newLine(); } /** * @throws Exception * @Title: main * @Description: * @param @param args * @return void * @throws */ public static void main(String[] args) throws Exception { Properties pro = new Properties(); File file = new File("e:\\ss.properties"); try { // File pro.load(file); pro.setProperty("zohan", "zohan"); System.out.println(pro.get("zohan")); // pro.store("e:\\ss.properties", null); } catch (IOException e) { e.printStackTrace(); } } }

    이틀 전 코드 에 bug 가 있 었 습 니 다.키 쌍 에 등호 가 있 는 것 은 지원 되 지 않 습 니 다.오늘 bug 를 복원 하여 다시 보 냅 니 다.

좋은 웹페이지 즐겨찾기