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

Java解析网络数据流的三种特殊方法
 
 
被过滤广告
 
[文章信息]
 
作者:徐荣胜
时间:2005-05-19
出处:cn-java
责任编辑:方舟
 
[文章导读]
 
Java作为最开放的语言,已越来越受到网络程序员的青睐
 
 
 
 
advertisement
  
 
 
热点推荐
 
· 图文详解:黑客入侵方式演示
· Java异常处理的陋习展播
· 多媒体系列教程:网页设计制作
· Powerpoint动画演示教程连载
· 光盘刻录手册:禁忌与技巧(下)
 
 
 
 
 
[正文]  
 
 
  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等知识。

From:http://www.yesky.com/SoftChannel/72342371961929728/20050519/1950680.shtml
http://cache.baidu.com/c?word=java%3B%BD%E2%CE%F6%3B%CD%F8%C2%E7%3B%CA%FD%BE%DD%3B%C1%F7%3B%B5%C4%3B%C8%FD%D6%D6%3B%CC%D8%CA%E2%3B%B7%BD%B7%A8&url=http%3A//www%2Eyesky%2Ecom/SoftChannel/72342371961929728/20050519/1950680%2Eshtml&p=8b2a901f96934ead49f5c931

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整全套资源下载地址:https://download.csdn.net/download/qq_27595745/70902624 【完整课程列表】 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第01章 Java语言概述 (共44页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第02章 基本数据类型和表达式 (共38页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第02章 基本数据类型和数组 (共52页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第03章 运算符、表达式、语句 (共51页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第04章 类与对象 (共159页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第05章 继承 接口与泛型 (共104页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第06章 字符串和正则表达式 (共62页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第08章 线程 (共100页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第09章 文件输入输出流 (共100页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第10章 成绩统计-数组与字符串 (共67页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第10章 基于SWING的图形用户界面 (共116页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第10章 基于SWING的图形用户界面设计 (共121页).ppt 完整超详细版 耿祥义 Java大学实用教程(第2版)PPT课件 第11章 Java中的网络编程 (共29页).ppt

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值