background image

Java 解析网络数据流的特殊方法

Java 作为最开放的语言,已越来越受到网络程序员的青睐。但这一青睐族有着同样的经

——

曾经都为网络上通信的 Java 数据格式而烦脑。

  笔者也不例外,曾经为此而查阅了很多文档,经过反复测试才得以解决
  ,如今笔者已经在所从事的很多电子政务项目中顺利的应用。今天笔者写此文,介绍
用 Java 解析网络数据的三种特殊方法,希望对正在寻求这方面问题答案的读者有所帮助。
  UTF8 转换成 GB2312 当我们在基于 HTTP 协议的 JSP 或 Servlet 的应用中获取数
据或发送请求时,JVM 会把输送的数据编码成 UTF8 格式。如果我们直接从 HTTP 流中提

取中文数据,提取的结果为 ????”(可能更多问号),为转换成我们能够理解的中文字符,
我们需要把 UTF8 转换成 GB2312,借助 ISO-8859-1 标准编码能够轻易的实现,下面
的代码实现了这一功能:
  byte [] b;
  String utf8_value;
    utf8_value = request.getParameter("NAME");// 从 HTTP 流 中 取 "NAME" 的
UTF8 数据

  b = utf8_value.getBytes("8859_1"); //中间用 ISO-8859-1 过渡

  String name = new String(b, "GB2312"); //转换成 GB2312 字符

 

    在 知 道 流 长 度 的 情 况 下 将 输 入 流 转 换 成 字 节 数 组 Java 中 的 输 入 流 抽 象 类
InputStream 有 int read(byte[] b, int off, int len)方法,参数中 byte[] b 是用来存放
从 InputStream 中读取的数据,int off 指定数组 b 的偏移地址,也就是数组 b 的起始下
标,int len 指定需要读取的长度,方法返回实际读取的字节数。刚学 Java 的朋友可能要
说:先定义一个与流长度等长的字节数组,调用 read 方法,指定起始下标为 0,指定读
取长度与数组长度等长,不是一下子可以读出来了吗?说的没错,笔者曾经也试着这样读
取数据,但后来发现在读取网络数据时很不安全,我们想想在网络上获取数据可能并没
那么流畅,数据流的传送可能会断断续续,所以并不能保证一次就能读取全部数据,特
别是在读取大容量数据时更是如此,所以我们必须在读取数据时检测实际读到的长度,
如果没有读完已知长度的数据就应该再次读取,以此循环检测,直到实际读取的长度累
加与已知的长度相等,下面的代码实现了这一功能:
  ServletInputStream inStream = request.getInputStream(); //取 HTTP 请求流

  int size = request.getContentLength(); //取 HTTP 请求流长度

  byte[] buffer = new byte[size]; //用于缓存每次读取的数据

  byte[] in_b = new byte[size]; //用于存放结果的数组