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]; //用于存放结果的数组
int count = 0;
int rbyte = 0;
while (count < size) { //循环读取
rbyte = inStream.read(buffer); //每次实际读取长度存于rbyte中
for(int i=0;i<rbyte;i++) {
in_b[count + i] = buffer[i];
}
count += rbyte;
}

在不知道流长度的情况下将输入流转换成字节数组 前面介绍了已知流长度的情况下的转换方法,那么当我们不知道流有多长时,也就是说不能确定转换后的字节数组有多大时,该怎么处理呢?笔者查看了JDK文档之后发现ByteArrayOutputStream有一个byte[] toByteArray()方法,该方法会自动创建一个字节数组,然后返回。于是就巧妙的用ByteArrayOutputStream来作中间过渡实现转换,其它处理跟上面所介绍已知长度的情况差不多。假设需要被转换的流已经放在inStream里了,我们可以用如下的代码实现这一功能:

ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] in_b = swapStream.toByteArray(); //in_b为转换之后的结果

上面介绍了三种比较实用的Java数据转换,有兴趣的朋友可通过nbDeveloper@hotmail.com与笔者取得联系,进一步交流其它有关XML应用、程序设计模式、J2EE开发以及UML等知识。

时间: 2024-08-03 14:42:08

Java解析网络数据流的三种特殊方法的相关文章

java中关于Map的三种遍历方法详解_java

map的三种遍历方法!集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ 复制代码 代码如下: /* * To change this template, choose Tools | Templates * and open the template in the editor. */package cn.tsp2c.liubao;import java.util.Collection;import java.util.HashMap;import java.util

Android编程实现XML解析与保存的三种方法详解

本文实例讲述了Android编程实现XML解析与保存的三种方法.分享给大家供大家参考,具体如下: 简介 在Android开发中,关于XML解析有三种方式,分别是: 1. SAX 基于事件的解析器,解析速度快,占用内存少.非常适合在Android移动设备中使用. 2. DOM 在内存中以树形结构存放,因此检索和更新效率会更高.但是对于特别大的文档,解析和加载整个文档将会很耗资源 3. PULL 基于事件的解析器,不同于SAX是,PULL是主动请求下一个事件,所以在可控上PULL要比SAX实用.An

网络营销的三种境界

借鉴国学大师王国维的境界说,我们品尝一下网络营销的三种境界. 境界一:昨夜西风凋碧树,独上高楼,望断天涯路 解读1:不知做什么 网络营销是中小企业的必由之路,这一点已逐渐得到广泛的认同.然而怎样才算成功的网络营销呢,这个问题在网络营销发展历史中却有不同的回答.从早期的网络营销就是做网站,到后来的网络营销就是做推广,到今天的网络营销就是"平台+推广+转化",对于网络营销的认识才逐渐成熟起来. 每天都有新的企业开始知道网络营销这个名词,必然要经历"不知做什么"这个阶段,

简述在Java Web组件之间的三种关联关系

在Java Web组件之间的三种关联关系: 1.请求转发 2.URL重定向 3.包含 请求转发: 允许把请求转发给同一应用程序中的其他web组件. 这种技术通常用于web应用控制层的servlet流程控制器,它检查http请求数据,并将请求转发到适合的目标组件,目标组建执行具体的请求处理操作,并生成响应结果. jsp页面中添加servlet中加入下面代码: <jap:forward page="hello.jsp"/> RequestDispatcher rd=reques

win8系统网络总是受限的三种解决方法

win8系统网络总是受限的三种解决方法   方法一: 1.在电脑右下角右键点击无线网图标,在弹出菜单中选择打开网络和共享中心 2.进入网络共享中心,点击打开"连接"右侧的WLAN 3.进入WLAN状态页面,显示无Internet访问权限,点击打开页面下方的属性按钮 4.进入WLAN属性页面,点击打开配置按钮

网络数据加密的三种技术

数据加密作为一项基本技术是所有通信安全的基石.数据加密过程是由形形色色的加密算法来具体实施,它以很小的代价提供很大的安全保护.在多数情况下,数据加密是保证信息机密性的唯一方法.据不完全统计,到目前为止,已经公开发表的各种加密算法多达数百种.如果按照收发双方密钥是否相同来分类,可以将这些加密算法分为常规密码算法和公钥密码算法. 在常规密码中,收信方和发信方使用相同的密钥,即加密密钥和解密密钥是相同或等价的.比较著名的常规密码算法有:美国的DES及其各种变形,比如Triple DES.GDES.Ne

Java list三种遍历方法性能比较

从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象,测试代码例如以下: package com.hisense.tiger.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListTest { publi

Java追加文件内容的三种方法

Java追加文件内容的三种方法 /** * 描述:追加内容到文件末尾 * @author Roger Federer * */ public static void main(String[] args) throws IOException { File fileOrFilename = new File("d://text.txt"); // 方法 一 //追加文件:使用FileOutputStream,在构造FileOutputStream时,把第二个参数设为true Buffe

网络营销的三种方式你喜欢哪种

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网络拉客户的三种方式您喜欢哪种? 1.通过b2b类网站来拉客户,如:alibaba.com ,环球资源,made in china 上放产品,买广告位; 2.通过google adwords ,百度竞价排名来让产品在搜索引擎中获得好排名; 3.制作营销型网络营销平台,让网站中的产品在搜索引擎中排名好,带来客户. 上述三种的成本分析: 1.第一