自己写资源串处理文件

本文主要是模拟配置文件中的资源串文件,将最终处理结果存放于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。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值