网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java解析网络数据流的三种特殊方法介绍     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:75次  录入:管理员--2007-11-16  
 

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
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等知识。


 
 
上一篇: 使用Java程序来实现HTTP文件的队列下载    下一篇: 编程需要注意的陷阱:java继承是有害的
  相关文档
关于jdbc检测数据库用户的问题 11-17
java安全:运用加密技术保护java源代码 09-24
java新手入门:整理scjp听课笔记 11-17
一个用java写的测算服务器响应速度的程序 11-17
选择合适的jdbc驱动程序 11-17
merlin 的魔力:merlin 的新 i/o 缓冲区的输入和输出 11-17
构造jsp/javabean开发和发布环境的简单办法 11-17
java: jni完全手册 11-16
jstl 入门:表示就是一切的一切 11-17
gavin king的java ee 6愿望清单第二弹:jsf和el增强 11-17
解决运行eclipse内存不足的问题 11-17
ejb技术的数据库应用(1) 11-17
揭开java 安全标准的神秘面纱 11-16
was 6与websphere mq6的整合 11-17
bea推首款面向ejb3持久性引擎eclipse工具 11-17
使用模仿对象进行单元测试 11-17
解决在j2me平台上的手机游戏移植的问题 11-16
使用resin3.0配置运行java servlet 11-17
j2ee应用性能问题的常用优化项目 11-17
servlet技术及其与cgi的比较 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息