자바 작업 properties 파일 의 영구적 인 키 쌍 과 주석 파일
12948 단어 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 \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 를 복원 하여 다시 보 냅 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Spring] properties 파일에 정의된 값 가져오기실시간 강의 수업 중 Admin key에 관련된 이야기가 나와 1,2차 Python, Flask 프로젝트에서 DB등 보완이 필요한 값들에 대해서 다른 곳에 따로 저장하고 변수에는 Path 설정해주고 github에 올...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.