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;)
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为转换之后的结果

转载于:https://blog.51cto.com/7825719/1283784

黑马程序员_Java解析网络数据流的三种特殊方法相关推荐

  1. 黑马程序员_java自学学习笔记(八)----网络编程

    黑马程序员_java自学学习笔记(八)----网络编程 android培训. java培训.期待与您交流! 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无 ...

  2. 黑马程序员_java高级篇网络编程TCP实战Day8(上)

    ---------------------ASP.Net+Android+IOS开发.Net培训.期待与您交流! ----------- 黑马程序员_java高级篇网络编程TCP实战Day8(上) ( ...

  3. 黑马程序员-----集合框架类(四) 高级for循环、方法的可变参数及静态导入

    ------- android培训.java培训.期待与您交流! ---------- 黑马程序员-----集合框架类(四) 高级for循环.方法的可变参数及静态导入 1.1 高级for循环(示例1) ...

  4. 黑马程序员Java教程学习笔记(三)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...

  5. Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)

    Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 三.第三阶段 C++提高编程 介绍C++泛型编 ...

  6. 黑马程序员C语言基础(第三天)

    黑马程序员C语言基础(一)第三天 https://www.bilibili.com/video/BV15W411K7k6?p=40 文章目录 低级语言与高级语言 c语言优缺点 c语言应用领域 通过gc ...

  7. 黑马程序员C++学习笔记(第三阶段核心:STL)--- 更新中

    目录 迭代器 序列式容器 vector -- 可随机访问 list -- 不支持随机访问 deque -- 动态 关联式容器 -- 红黑树 map multimap set multiset -- 废 ...

  8. 黑马程序员_java总结_网络编程基础

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ------------ 现在总结网络编程.在网络通信中,人们把网络通信分为了多个层.为了方便理解,我 ...

  9. 黑马程序员_JAVA相关基础知识

    ------- android培训.java培训.期待与您交流! -------- JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便 ...

最新文章

  1. 少年郎,你需要封装好的ViewPager工具类
  2. python中转义字符怎么用_python中的转义字符i
  3. 8行代码教你搞定导航控制器全屏滑动返回效果 ————转载
  4. 华为鸿蒙系统真的好吗,鸿蒙系统真的成熟吗?华为还有很长的路要走
  5. requestmapping配置页面后_第004课:Spring Boot 项目属性配置
  6. SWFUpload下载地址
  7. c#变量初始化的学习
  8. 盗链 防止盗链 防止图片盗链
  9. Android程序反破解技术
  10. 离散数学·集合论【基本的集合恒等式】
  11. 1024 程序员节狂欢盛会,等了一年终于来了(内附大会日程)
  12. disable属性导致后台接收值为null解决方法
  13. Mysql之st_distance_sphere计算两坐标点距离
  14. 第三方支付结算周期T1,T0,D1,D0区别
  15. 原画 机器人总动员_《机器人瓦力》导演执导 科幻史诗巨制《火星上的约翰·卡特》首支震撼预告...
  16. 一些俗语,不思八九,常想一二
  17. 修复柱面要多少时间_宜昌平面设计培训多少钱大约要学习多长时间
  18. 论文笔记:Planning and Decision-Making for Autonomous Vehicles
  19. 马走日,象走田;车走直路炮翻山
  20. [附源码]java毕业设计医院档案管理系统

热门文章

  1. Windows Azure 解决方案系列:组合拍卖供应商以云服务快速拓展,并节省成本
  2. Hive mac 客户端工具DbVisualizer配置
  3. 使项目持续集成支持Carthage管理
  4. Handler机制的源码分析
  5. gunzip 和 unzip 解压文件到指定的目录
  6. 使用标准模板find函数来对结构体容器进行查找
  7. [转]Android UI 自动化测试
  8. 目标检测之线段检测---lsd line segment detector
  9. 商务智能 “软肋”何在?
  10. 医学研究——造福全人类