此页面上的内容需要较新版本的 Adobe Flash Player。

获取 Adobe Flash Player

  • 网站主页
  • 中心简介
  • 新闻动态
  • 课程详解
  • 师资力量
  • 招生问答
  • 就业广场
  • 在线报名
  • 学习园地
  • 证书查询
  • 唐城论坛
  • 陈老师  程老师  2010年唐城开学典礼 |2010年招生简章 |高考生专区 |中专/职高生专区 |大学生专区 |技术讲座 |春季就业班 |北大青鸟学费
    • 1
    • 2
    • 3
    热点新闻学习园地求职技巧
    北大青鸟IT教育咨询热线:010-65595970
    北大青鸟北京唐城中心开班信息
    报名截止 班级类型 报名情况
    09月24日白领就业班热招中
    09月20日青鸟尖子班热招中
    09月17日高考生特招班余10座
    09月13日高考补录班余5座
    09月10日CBD就业班已满
    北大青鸟唐城中心技术团
    内容:网页设计,3G揭秘等
    时间:每周三 下午13:30
          每周六 下午13:30
    主讲:北大青鸟资深IT专家
    地址:北大青鸟唐城报告厅
    人数:25人
    预约热线:010-65003443

    点击查看详情>>>
    您的位置:北大青鸟首页->新闻动态 -> 学习园地

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

    发布日期:2010-02-02

        介绍用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为转换之后的结果

    在线报名
     姓名 *:
     性别: 男 女
     年龄*:
     学历*:
     课程: 脱产班 业余班
     您所在地区:
     联系电话*:  
     学习人员:  
     你的状态*: 上学 工作 待业
     您现在哪里上网: 网吧 学校 家里 单位
     您知道本网站的途径*:
    百度 GOOGLE TOM 新浪 搜狐 雅虎 搜狗 贴吧
    社区活动 宣传页 报纸刊物 马路广告牌 朋友介绍 其他网站
     请您留言:
        



    友情链接:广州北大青鸟西安北大青鸟北京北大青鸟北京北大青鸟教育培训武汉北大青鸟福州北大青鸟洛阳北大青鸟广州投资策划播音主持培训够级武汉北大青鸟徐州北大青鸟二级建筑师网珠海培训网安徽北大青鸟深圳北大青鸟苏州北大青鸟北大青鸟西安毕诚郑州北大青鸟北大青鸟徐州北大青鸟
    招生简章|招聘信息|北大青鸟地址|中心地图|在线报名|北大青鸟怎么样
    北京亿网互动科技有限公司版权所有
    地址:北京市朝阳区红庙北里64号楼(北大青鸟院内)
    电话:010-65003443
    传真:010-65000071-6802
    京ICP备08003493号
    本站关键词:

    北京北大青鸟

     

    北大青鸟

      北大青鸟总部