本文主要是模拟配置文件中的资源串文件,将最终处理结果存放于Map中。
第一步:读取文件数据进入字节数组。
/**
* 通过文件路径读取文件内容,返回字节数组。
*
* @param name
* @return
*/
final static public byte[] readfile(String name) {
FileInputStream in = null;
byte buffer[] = null;
try {
in = new FileInputStream(new File(name));
buffer = new byte[in.available()];
in.read(buffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer;
}
第二步:过滤文件中的多余空格、换行以及注释。支持/*……*/样式的注释。
/**
* 过滤文件中的注释以及多余的空格。<br>
* 此种注释只支持/*格式的。<br>
* 处理过滤换行以及换行中的空格。
*
* @param b
* @return
*/
final static public byte[] filter(byte[] b) {
byte[] bb;
int record, temp = b.length;
boolean flag = true;
for (int i = 0; i < b.length - 1; i++) {
record = 0;
if (b[i] != 0x2F || b[i + 1] != 0x2A) {
if (b[i] == 0x0D && b[i + 1] == 0x0A) {
flag = true;
for (int j = 0; flag && j < b.length - 2; j++) {
if (i + j + 2 < b.length - 1 && b[i + j + 2] == 0X20) {
record++;
} else if (i + j + 3 < b.length - 1
&& b[i + j + 2] == 0x0D && b[i + j + 3] == 0x0A) {
record = record + 2;
j++;
} else {
flag = false;
}
}
}
} else {
int index = i;
record = 0;
while (!(b[index] == 0x2A && b[index + 1] == 0x2F)) {
index++;
record++;
}
record = record + 4;
}
if (record != 0) {
int j = b[i] != 0x2F || b[i + 1] != 0x2A ? i + 2 : i;
for (; j < b.length - record; j++) {
b[j] = b[j + record];
}
for (int k = 0, m = b.length - 1; k < record; m--, k++) {
if (k == record - 2) {
b[m] = 0x0A;
b[m - 1] = 0x0D;
break;
} else {
b[m] = 0x00;
}
}
}
if (b[i] == 0X00) {
temp = i;
break;
}
}
bb = new byte[temp];
System.arraycopy(b, 0, bb, 0, temp);
return bb;
}
第三步:解析过滤后的字节数组,存放于Map中。
/**
* 将文件信息内容保存为Map,可以通过键值获取。<br>
* 同名键值将被后者覆盖。
*
* @param b
* @return
*/
final static public HashMap<String, byte[]> parse(byte[] b) {
int req = 0, ren = 0, fen = 0;
HashMap<String, byte[]> map = new HashMap<String, byte[]>();
byte[] index = null, value = null;
for (int i = 0; i < b.length; i++) {
if (b[i] == 0X3D) {
req = i;
fen = ren;
} else if (b[i] == 0X0A) {
ren = i;
fen = fen == 0 ? -1 : fen;
index = new byte[req - fen - 1];
value = new byte[ren - req - 2];
System.arraycopy(b, fen + 1, index, 0, req - fen - 1);
System.arraycopy(b, req + 1, value, 0, ren - req - 2);
map.put(new String(index), value);
}
}
return map;
}
第四步:过程中使用到的工具类。
1、转换中文字符工具。
/**
* 转换中文字符。
*
* @param b
* @return
*/
final static public String reserve(byte[] b) {
try {
return new String(b, "gb2312");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
2、输出解析出来的字节数组数据,注意处理中文。
/**
* 输出解析出来的字节数组。
*
* @param b
*/
final static public void toStringBytes(byte[] b) {
byte[] bb = new byte[2];
for (int i = 0; i < b.length; i++) {
if (b[i] < 0) {
bb[0] = b[i];
bb[1] = b[i + 1];
System.out.print(reserve(bb));
i++;
} else {
System.out.print((char) b[i]);
}
}
}
3、输出解析出来的Map数据。
/**
* 输出解析出来的Map数据。
*
* @param map
*/
final static public void toStringBytes(HashMap<String, byte[]> map) {
Set<String> keys = (Set<String>) map.keySet();
for (String string : keys) {
System.out.println(string + "=----=" + new String(map.get(string)));
}
}
第五步:测试代码。
public static void main(String[] args) {
byte[] b = readfile("C://resourse.propertity");
toStringBytes(b);
System.out.println();
System.out.println("------------MMMMMMMMMMMMM--------------");
toStringBytes(parse((filter(b))));
}
附注:
测试的resourse.propertity文件内容:
/*yuifuidsygsuid
fghfdgfghfdjhgdjgf*/
ireader.index.name=索引页面
/*yuifuidsygsuid
fghfdgfghfdjhgdjgf*/
ireader.index.title=标题
/*yuifuidsygsuid*/
ireader.index.confirm=确认
ireader.index.cancel=取 消
ireader.index.cancel=取 消34325
ireader.index.ok=好
程序执行的结果:
/*yuifuidsygsuid
fghfdgfghfdjhgdjgf*/
ireader.index.name=索引页面
/*yuifuidsygsuid
fghfdgfghfdjhgdjgf*/
ireader.index.title=标题
/*yuifuidsygsuid*/
ireader.index.confirm=确认
ireader.index.cancel=取 消
ireader.index.cancel=取 消34325
ireader.index.ok=好
------------MMMMMMMMMMMMM--------------
ireader.index.cancel=----=取 消34325
ireader.index.ok=----=好
ireader.index.title=----=标题
ireader.index.name=----=索引页面
ireader.index.confirm=----=确认
Ok。基本满意。
附加增强功能:
如下操作支持了注释结束后的换行以及空格的过滤,并且提取公共方法,是程序看起来简洁,易于理解。
修改方法filter.java
final static public byte[] filter(byte[] b) {
byte[] bb;
int record, temp = b.length;
for (int i = 0; i < b.length - 1; i++) {
record = 0;
if (b[i] != 0x2F || b[i + 1] != 0x2A) {
record = filterenterblank(b, i, record);
} else {
int index = i;
record = filternote(b, index, record);
index += record;
record += 4;
record = filterenterblank(b, index + 2, record);
}
if (record != 0) {
int j = b[i] != 0x2F || b[i + 1] != 0x2A ? i + 2 : i;
moveelems(b, j, record);
fillinvalid(b, record);
}
if (b[i] == 0X00) {
temp = i;
break;
}
}
bb = new byte[temp];
System.arraycopy(b, 0, bb, 0, temp);
return bb;
}
增加两个过滤方法:
1、过滤空格以及换行:
final static public int filterenterblank(byte[] b, int i, int record) {
boolean flag = true;
if (i + 1 < b.length && b[i] == 0x0D && b[i + 1] == 0x0A) {
flag = true;
for (int j = 0; flag && j < b.length - 2; j++) {
if (i + j + 2 < b.length - 1 && b[i + j + 2] == 0X20) {
record++;
} else if (i + j + 3 < b.length - 1 && b[i + j + 2] == 0x0D
&& b[i + j + 3] == 0x0A) {
record = record + 2;
j++;
} else {
flag = false;
}
}
}
return record;
}
2、过滤注释。
final static public int filternote(byte[] b, int i, int record) {
while (i + 1 < b.length && !(b[i] == 0x2A && b[i + 1] == 0x2F)) {
i++;
record++;
}
return record;
}
提取两个方法:
1、移动元素。
final static public void moveelems(byte[] b, int i, int record) {
for (; i < b.length - record; i++) {
b[i] = b[i + record];
}
}
2、填充无效字符,为以后的拷贝数组提供依据。
final static public void fillinvalid(byte[] b, int record) {
for (int k = 0, m = b.length - 1; k < record; m--, k++) {
if (k == record - 2) {
b[m] = 0x0A;
b[m - 1] = 0x0D;
break;
} else {
b[m] = 0x00;
}
}
}
OK,暂时还是很满意,没有发现再大的BUG。