`
gao_20022002
  • 浏览: 164793 次
  • 性别: 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  
目前还没有支持其他的几种注释

相关推荐

    通过C#资源处理实现文件打包

    资源文件是程序中存储非代码数据的地方,这些数据可能包括图标、图片、声音、文本字符串或其他任何类型的二进制数据。在C#中,资源可以通过.resx文件创建,这是一个XML格式的文件,用于存储键值对,其中键是资源的...

    字符串处理,带配置文件指定读入和读出文件

    然后,根据这些路径打开文件,读取输入数据,进行必要的字符串处理;处理完成后,将结果写入到指定的输出文件。同时,为了确保程序的健壮性,需要处理可能出现的异常,如文件不存在、读写权限不足等。 在提供的...

    c#各种资源文件处理

    在C#编程中,资源文件处理是一个至关重要的环节,它涉及到应用程序中的图片、音频、文本、配置文件等各类素材的管理。本篇文章将深入探讨如何在C#中有效地管理和操作这些资源,以便在项目开发中实现高效且灵活的资源...

    java 写文件 java 写文件 java 写文件 java 写文件

    Java编程语言提供了丰富的API用于处理文件操作,包括创建、读取、写入和删除文件等。在Java中,写文件是通过`java.io`包中的类实现的,主要涉及File类、FileWriter类、BufferedWriter类等。下面将详细阐述Java写文件...

    java资源文件的处理

    资源文件通常包含非代码数据,如配置信息、文本字符串、图片、音频或视频等,它们能够使程序更加灵活和可维护,同时也为开发者提供了便利的错误处理机制。 资源文件`.properties`是一种广泛使用的格式,尤其适用于...

    delphi读写PE文件

    7. **压缩包子文件**:提供的文件列表中,如Unit1.pas可能是Delphi的源代码文件,NetConfig.exe是编译后的可执行文件,brcc32.exe是RC(Resource Compiler)工具,用于处理资源文件。其余文件如Unit1.dcu、Unit1.dpr...

    串口文件传输系统源代码

    在串口文件传输中,资源管理非常重要,包括串口资源、内存资源以及可能的网络资源。源代码应该有良好的错误处理机制,确保在异常情况下正确释放资源,防止内存泄漏或串口占用不释放。 8. **调试与测试**: 开发者...

    c#使用资源文件实现多语言

    在ASP.NET中,你还可以在ASPX页面上直接使用`Localize`控件或`Resx`数据绑定表达式来引用资源文件中的字符串。例如: ```asp.net $ Resources:Resources, Greeting %&gt;" /&gt; ``` 对于用户界面的动态切换,你可以通过...

    串口数据保存至TXT文件.rar

    5. **保存数据至TXT文件**:将处理好的数据保存到TXT文件,可以使用“File Write String”函数。指定文件路径和写入模式(覆盖或追加),然后传递要写入的字符串。每次读取到新的串口数据后,都可以调用这个函数更新...

    Windows二进制字符串资源的处理方法

    ### Windows二进制字符串资源的处理方法 #### 一、字符串资源的概念与重要性 在Windows GUI程序开发中,资源管理是一项重要的任务。资源是指用来描述界面或其他特征的描述性字符,例如图标、对话框、菜单等。这些...

    串口ymodem传输文件

    总的来说,ymodem协议是串口通信中一种高效且可靠的文件传输方式,尤其适用于资源有限的环境。通过理解和使用ymodem,你可以更好地理解和控制串口设备之间的数据交换,这对于嵌入式开发、物联网应用或者对老旧硬件的...

    一个用VBNET做的资源文件编辑器,希望大家喜欢

    VB.NET(Visual Basic .NET)是Microsoft开发的一种面向对象的编程语言,它提供了丰富的功能来处理资源文件。本篇文章将详细介绍如何利用VB.NET创建一个资源文件编辑器,并探讨其核心概念和技术。 首先,我们需要...

    多线程字符串代码文件搜索器

    在现代软件开发中,高效地处理大量数据是一项基本需求,尤其是在处理文件系统中的文本数据时。"多线程字符串代码文件搜索器"正是为了解决这一问题而设计的。这个工具是用VC(Visual C++)编写的,它具备强大的功能,...

    vb.net嵌入和调用资源文件示例.zip

    在VB.NET编程中,资源文件的管理是一项重要的任务,它涉及到程序中静态数据的存储和访问,如字符串、图像、音频、配置文件等。资源文件的嵌入和调用不仅有助于代码的组织,还能提高程序的可移植性和安全性。本示例...

    C++字符串处理类库及范例

    "C++字符串处理类库及范例"就是这样一个资源,它专门针对字符串操作进行了优化,提供了强大的功能,包括字符串的分割、自定义分隔符的使用、字符串匹配和搜索等。这个库无需编译和安装,可以直接在项目中应用,大大...

    VB中资源文件.res的使用方法详解

    资源文件是一种专门用于存储程序所需的各种类型资源(如位图、图标、字符串等)的文件。使用资源文件可以显著提高应用程序的性能和维护性,因为它们允许开发者将频繁使用的资源(如图标和图片)与代码分离,并且能够...

    c#资源文件使用方法

    在C#编程中,资源文件是一个非常重要的概念,它允许开发者在应用程序中嵌入各种类型的数据,如文本、图像、音频、视频等。资源文件的使用可以极大地提高代码的组织性和可维护性,并且便于国际化和本地化。下面将详细...

    字符串处理函数(9KB)

    描述中的“9KB”可能是指相关代码或资源的大小,这通常表示这是一个相对较小的文件,可能包含了基础的字符串处理功能。 在大多数编程语言中,字符串处理函数提供了丰富的功能,如: 1. **创建与初始化**:如`str()...

    C#实现串口操作(包括读写串口,显示数据)

    2. **关闭串口**:在完成串口通信后,需要调用`Close()`方法关闭串口,释放资源。关闭串口的代码如下: ```csharp serialPort.Close(); ``` 3. **读取数据**:使用`ReadLine()`或`ReadBytes()`方法可以获取串口接收...

    VC++在程序中以资源的形式保存、释放和使用文件的示例代码

    资源是Windows应用程序中的一个重要组成部分,它们可以是图标、位图、对话框模板、字符串、菜单、声音文件等。资源通过.rc(Resource Script)文件进行定义,编译后生成.res文件,最终被链接器合并到可执行文件中。 ...

Global site tag (gtag.js) - Google Analytics