package tarzan.game.tetris.global;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.regex.Pattern;
/**
* 属性表类(支持设置字符编码, 支持以原格式保存文件)<br>
* 修改自JDK1.4.2的java.util.Properties<br>
* 从属性文件中加载, 及保存属性文件时, 支持根据设置的字符编码写入文件<br>
* 同时会尽量保持原有的行信息及注释信息<br>
* 但原有的换行符无法恢复
* @author tarzan
*/
public class Properties {
/**
* 串行版本标识
*/
private static final long serialVersionUID = 1646288880214479727L;
/**
* 数据
*/
protected HashMap data = new HashMap();
/**
* 默认数据
*/
protected Properties defaults;
/**
* 原始数据信息
*/
protected ArrayList infos = new ArrayList();
/**
* 读取文件和写入文件时采用的编码方式
*/
protected String encoding;
public Properties() {
this(null);
}
public Properties(Properties defaults) {
this.defaults = defaults;
this.encoding = "UTF-8";
}
private static final String keyValueSeparators = "=: \t\r\n\f";
private static final String strictKeyValueSeparators = "=:";
private static final String specialSaveChars = "=: \t\r\n\f#!";
private static final String whiteSpaceChars = " \t\r\n\f";
/**
* 设置字符编码, 读取文件和写入文件时采用该编码
* @param encoding
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
}
/**
* 获取字符编码, 读取文件和写入文件时采用该编码
* @return
*/
public String getEncoding() {
return encoding;
}
/**
* 设置属性键值对, 在文档的最后增加
* @param key
* @param value
* @return 如果是新增返回null, 如果是替换返回原来的value
*/
public synchronized String setProperty(String key, String value) {
if(!data.containsKey(key)) {
infos.add(new Key(key));
}
return (String)data.put(key, value);
}
/**
* 增加属性键值对, 在文档的最后增加
* @param key
* @param value
* @return 如果是新增, 返回null, 如果是替换返回原来的value
*/
public synchronized String addProperty(String key, String value) {
return setProperty(key, value);
}
/**
* 增加空行, 在文档的最后增加
*/
public synchronized void addLine() {
infos.add(Line.ONE);
}
/**
* 增加多个空行, 在文档的最后增加
* @param count
*/
public synchronized void addLine(int count) {
infos.add(count == 1 ? Line.ONE : new Line(count));
}
/**
* 增加注释, 在文档的最后增加
* @param comment
*/
public synchronized void addComment(String comment) {
infos.add(new Comment(comment));
}
/**
* 增加多行注释, 在文档的最后增加
*/
public synchronized void addComment(String[] comments) {
for(int i = 0; i < comments.length; i++) {
infos.add(new Comment(comments[i]));
}
}
/**
* 插入属性键值对, 在目标位置的上一行插入
* @param pointer 目标位置的key
* @param key
* @param value
* @return 如果是新增, 返回null, 如果是替换返回原来的value
*/
public synchronized String insertProperty(String pointer,
String key, String value) {
return addProperty(pointer, key, value, false);
}
/**
* 插入空行, 在目标位置的上一行插入
* @param pointer 目标位置的key
*/
public synchronized void insertLine(String pointer) {
addLine(pointer, 1, false);
}
/**
* 插入多个空行, 在目标位置的上一行插入
* @param pointer 目标位置的key
* @param count
*/
public synchronized void insertLine(String pointer, int count) {
addLine(pointer, count, false);
}
/**
* 插入注释, 在目标位置的上一行插入
* @param pointer 目标位置的key
* @param comment
*/
public synchronized void insertComment(String pointer, String comment) {
addComment(pointer, new String[]{comment}, false);
}
/**
* 插入多行注释, 在目标位置的上一行插入
* @param pointer 目标位置的key
* @param comments
*/
public synchronized void insertComment(String pointer, String[] comments) {
addComment(pointer, comments, false);
}
/**
* 附加属性键值对, 在目标位置的下一行插入
* @param pointer 目标位置的key
* @param key
* @param value
* @return
*/
public synchronized String appendProperty(String pointer,
String key, String value) {
return addProperty(pointer, key, value, true);
}
/**
* 附加空行, 在目标位置的下一行插入
* @param pointer 目标位置的key
*/
public synchronized void appendLine(String pointer) {
addLine(pointer, 1, true);
}
/**
* 附加多个空行, 在目标位置的下一行插入
* @param pointer 目标位置的key
* @param count
*/
public synchronized void appendLine(String pointer, int count) {
addLine(pointer, count, true);
}
/**
* 附加注释, 在目标位置的下一行插入
* @param pointer 目标位置的key
* @param comment
*/
public synchronized void appendComment(String pointer, String comment) {
addComment(pointer, new String[]{comment}, true);
}
/**
* 附加多行注释, 在目标位置的下一行插入
* @param pointer 目标位置的key
* @param comments
*/
public synchronized void appendComment(String pointer, String[] comments) {
addComment(pointer, comments, true);
}
/**
* 增加属性键值对
* @param pointer 目标位置的key
* @param key
* @param value
* @param append 追加标志: true.在目标下一行插入|false.在目标上一行插入
* @return
*/
private synchronized String addProperty(String pointer,
String key, String value, boolean append) {
if(!data.containsKey(pointer)) { // 目标位置不存在, 增加至最后
return setProperty(key, value);
}
if(data.containsKey(key)) { // 不是新增项, 直接返回
return setProperty(key, value);
}
// 查找目标位置
int index = infos.indexOf(new Key(pointer));
if(index == -1) { // 目标位置不存在, 增加至最后
return setProperty(key, value);
}
if(append) index++;
infos.add(index, new Key(key)); // insert至上一个KEY的下面
return (String)data.put(key, value);
}
/**
* 增加空行
* @param pointer 目标位置的key
* @param count
* @param append 追加标志: true.在目标下一行插入|false.在目标上一行插入
*/
private synchronized void addLine(String pointer, int count,
boolean append) {
if(!data.containsKey(pointer)) { // 目标位置不存在, 增加至最后
addLine(count);
return;
}
// �
- 1
- 2
- 3
前往页