`
gao_20022002
  • 浏览: 160240 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自己写资源串处理文件

    博客分类:
  • Java
J# 
阅读更多

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

 

 

2
0
分享到:
评论
1 楼 surpass 2008-12-11  
目前还没有支持其他的几种注释

相关推荐

    文本文件字符串处理 MFC

    2、 对指定的文本文件进行读操作,将每一行字符串保存到一个动态空间中(可用地址指针数组或链表,也可用STL,这个随便),并显示出该文本文件的行数,最好是显示到一个编辑框中,也可以用提示框显示;(30) 3、 ...

    VB编程资源大全(英文源码 字符串)

    1,strs.zip 实现字节数组, 同c中的字符数组一样好用(6KB)&lt;END&gt;&lt;br&gt;2,modules.zip 字符串处理的12个...191.zip 字符串处理的12个例子(13KB)&lt;END&gt;&lt;br&gt;23,192.zip 检测文件中是否包含指定字符串(1KB)&lt;END&gt;

    FME常用转换器之字符串操作类视频讲解,讲解如何使用FME对字符串文件进行操作处理

    1.FME常用转换器之字符串操作类视频讲解,讲解如何使用FME对字符串文件进行操作处理。 2.本视频讲解中使用的FME版本为2020.2中文版。 3.本资源仅为视频讲解,用户需自行安装相应版本的FME。

    VB编程资源大全(源码 字符串)

    93.zip 演示快速排序算法(12KB) 19,62.zip 子分类技术的应用 (3KB) 20,45.zip 用VB写“多线程”程序(9KB) 21,190.zip 字符串查找和替换的实现例子(1KB) 22,191.zip 字符串处理的12...

    全能字符串替换机

    1、批量替换文件内容或文件批量改名:既批量处理多个文件,又批量处理多个替换串;提高了数据处理的效率,使数据在各个不同的系统中可以灵活转换;是数据处理、网页维护、源代码或资源文件修改等方面的好帮手; 2、...

    c语言实现ini文件读写操作

    C语言提供了丰富的标准库函数,使得处理文本文件和字符串操作变得简单高效。通过编写相应的读取和写入函数,开发者可以快速地将应用程序的配置信息与INI文件进行同步,确保配置的持久化和一致性。 在实际应用中,...

    pb9 写的字符串转化为数组函数

    将字符串转化为数组,资源为pb9导出来的文本文件,可以直接导入pb9,也可以打开查看

    字符串-Java解题分析-学习资料.zip

    字符串-Java解题分析-学习资料.zip 是一个关于Java中字符串处理的解题分析和学习资料的压缩文件。该资源主要涵盖了Java中字符串的基本操作、常见算法和问题解析,旨在帮助开发者深入理解字符串在Java中的运用,提高...

    CCJ多功能文件处理与编译器-&amp;amp;amp;gt;可将图片与文字编译成bin文件直接下载到MCU中

    ### CCJ多功能文件处理与编译器 V2.3 源代码开源地址:https://github.com/thtfcccj/FileMergeIndex.git * 资源文件合并: 将不同类型文件如各种图像合并成一个bin文件,并在头部生成位置数组(可理解为其指针),供...

    Visual C++ 编程资源大全(源码 文件)

    文件名包含全路径名(10KB)&lt;END&gt;&lt;br&gt;12,profile.zip 操作ini文件的例子(5KB) 13,scanfile.zip 如何在一个长文件中查找某一个特定的字符串(2KB)&lt;END&gt;&lt;br&gt;14,iniedit.zip 如何编辑ini文件以及任何包含文本...

    C#串口通信时丢失数据的一种解决方法

    C#串口通信时丢失数据的一种解决方法,刘凯,周云耀,C # 串行类( SerialPort )为串口通信提供了简便方法,且具有功能强大、通信快速、实时性好等特点。但在实际应用中,在串口高波特率大信

    visual C++_Turbo C串口通信编程实践

    1.2 自己制作简单的串口线 1.2.1 三线制串口接线的规定 1.2.2 焊接制作自己的串口连接线 1.3 调试串口通信程序时的几种使用串口的技巧 1.3.1 查看计算机串口资源 1.3.2 常规调试-2个物理串口之间的通信 1.3.3...

    S32K串口接收程序

    S32K串口发送和接收寄存器操作方式,不同于S32DS的库文件操作方式,该方式更加简便,更加节省资源。

    ExStudPE_ResExplorer_资源处理扩展插件_v106r10_a

    ExStudPE_ResExplorer_资源处理扩展插件 __[@贺胖哥绝对不胖 o(︶︿︶)o]__ 插件版本:v1.0.6 (Ansi) 主程序: 适用于 ExStudPE v1.4.3 及以上版本(兼容Unicode版) 【下载】 安装方法:讲本插件解压缩或者直接...

    一个可重用的VC++字符串处理函数集

    内容索引:VC/C++源码,字符处理, 一个VC++可重用的字符串处理函数集,这些函数主要包括: ... 压缩包中包含StringFunctins.h和StringFunctins.cpp是字符串处理函数的头文件和实现文件,main.cpp和main.h是一

    C++实现文件读写操作功能(源码+说明文档).zip

    #include &lt;string&gt; 用于处理字符串。 在main函数中,创建了一个std::ifstream对象inputFile,该对象用于读取文件。 使用try-catch块来尝试打开文件example.txt。如果打开文件时发生异常(例如文件不存在或权限不足...

    php开发经验总结,时间,字符串,文件,图像等常用的处理函数.zip

    【项目资源】:包含前端、后端、移动开发、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源等各种技术项目的源码。包括C++、Java、python、web、C#、EDA等项目的源码。 【适用人群】:适用于希望...

    Visual C++/Turbo C串口通信编程实践 及源代码-1

    2.4.3 改进三:彻底关闭串口,释放串口资源 44 第3章 控件mscomm串口编程 46 3.1 mscomm控件介绍 46 3.1.1 vc中应用mscomm控件编程步骤 46 3.1.2 mscomm控件串行通信处理方式 47 3.1.3 mscomm 控件的属性说明 ...

    人力资源管理软件(完全免费)

    人力资源管理软件功能介绍 本人力资源软件包含人事档案管理 本人力资源软件包含工资管理 本人力资源软件包含考勤管理 本人力资源软件包含绩效管理 本人力资源软件包含用户管理 本人力资源软件软件界面美观,...

    比较完善的文件操作jar文件

    自己写的比较完善的文件操作jar文件,实现了文件/文件夹的一些常用的操作,实现了文件的压缩解压,实现了部分字符串处理…… 资源分不够的朋友 欢迎进盟网〃编程交流中心(群):10939695群中提供下载及源码交流 更多...

Global site tag (gtag.js) - Google Analytics