`

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

上面介绍了三种比较实用的Java数据转换,有兴趣的朋友可通过nbDeveloper@hotmail.com与笔者取得联系,进一步交流其它有关XML应用、程序设计模式、J2EE开发以及UML等知识。
分享到:
评论
1 楼 luozhi114 2009-11-27  
原来回帖都那么多规矩啊~~~!!!
不过好贴我怎么可以不回呢,虽然我不太懂,可能我还是新手吧!但是也收教了!
顶下LZ

相关推荐

    java对mht文件解析

    #### 三、Java解析MHT文件的关键步骤 ##### 3.1 获取MHT文件内容 在Java中,首先需要读取MHT文件的全部内容到字符串中。这可以通过`InputStream`和`IOUtils`工具类来实现。 ```java String mhts = IOUtils....

    JAVA 解析 JSON 数据(包齐全)

    在Java编程中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人和机器都能容易地读取和编写数据。JSON格式通常用于客户端与服务器之间的数据传输,因为它的结构清晰、易于理解。本教程将...

    wis文件解析java实现jar包

    此jar包的实现可能包括了对字节流的逐字节读取,根据预定义的格式解析数据,然后将这些数据结构化为Java对象,最后将这些对象转换为csv格式的字符串。整个过程中,可能还涉及到了多线程或者异步处理,以提高大文件...

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    字节流是 java.io 中的基本流类型,用于处理二进制数据。字节流包括 InputStream 和 OutputStream 两种,前者用于输入,后者用于输出。 DataInputStream 和 DataOutputStream 是 java.io 中的高级字节流,提供了...

    java xml文件解析

    ### Java XML 文件解析详解 #### 一、XML 文件解析概述 XML (Extensible Markup Language) 是一种用于标记数据的语言,它的设计目的是传输和存储数据。XML 的灵活性使其成为多种应用场景中的首选格式,尤其是在...

    java socket 网络五子棋

    在Java Socket网络五子棋中,需要定义一套简单的协议来封装和解析游戏数据。例如,每个消息可能包含以下字段:玩家ID、棋盘位置、操作类型(落子或请求结束)等。这些字段以特定格式编码(如JSON或自定义二进制格式...

    JAVA解析PPT教案学习.pptx

    Java解析PPT教案主要涉及Java中的输入/输出流(I/O Stream)概念,这是Java编程中非常基础且重要的部分。在Java中,流是数据传输的抽象表示,它将不同的输入源(如键盘、文件、网络)和输出目标(如显示器、文件、...

    Java解析Excel与导入Excel

    通常,你需要实现的方法包括读取Excel文件,解析每个单元格的数据,根据单元格的位置和内容,映射到对应的实体类属性上。TestPoi这个示例可能就是一个测试类,用于演示如何使用easypoi进行Excel的导入操作。 在实现...

    boundary数据解析

    1. **读取数据**:首先,从接收到的数据流中读取内容,这可能来自HTTP请求体或电子邮件的正文。 2. **寻找边界**:使用指定的boundary字符串在数据中查找分隔符。边界前后可能有换行符或者额外的空格,因此需要考虑...

    详解XML各种解析方法

    而对于需要高效处理大型文档或实时数据流的应用,则SAX会更有优势。最终,开发人员应该根据自己的项目需求来决定使用哪种解析方法。通过深入了解这些解析技术的特点和限制,可以更好地利用XML的强大功能,提高软件...

    java_cvs_解析

    然而,在处理遗留的CVS项目时,理解CVS的工作原理和如何在Java中解析其数据仍然是必要的技能。 五、Java与Git集成 1. **JGit**:由Eclipse基金会维护的JGit是一个纯Java实现的Git库,可以方便地在Java项目中集成...

    Google Web Service Java解析

    总结,通过Java实现Google Web Service请求,主要涉及到URL构建、网络请求和数据解析三个关键步骤。利用Google提供的Java客户端库可以简化这个过程,提高开发效率。不过,实际开发时还需要关注错误处理、权限验证、...

    JAVA_API1.6文档(中文)

    java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供...

    100多道经典的JAVA面试题及答案解析

    Java中使用`public`、`private`和`protected`三种访问控制符来实现封装: - **Public**:公共成员可以被任何地方访问。 - **Private**:私有成员只能在当前类内部访问。 - **Protected**:受保护的成员可以被同一包...

    json串解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。在Java中,处理JSON串解析通常涉及到两个主要的库:Jackson和Gson。这两个库都提供了简单易用的API来序列化和...

    java 用户登录 文件流

    ### Java用户登录与文件流操作知识点解析 #### 一、概览 在给出的代码片段中,主要涉及到了几个核心的Java概念和技术点,包括文件流操作、接口和多态的应用,以及简单的用户输入和验证逻辑。这些技术点通常被用于...

    Java网络编程(第三版)中文版.part07.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part09.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    基于Java的RTSP服务源码

    - 处理媒体数据流的类,可能包括RTP和RTCP的管理,以及数据传输的线程模型。 4. **关键组件**: - `SessionManager`:管理客户端会话,存储每个会话的状态信息。 - `RequestHandler`:接收并解析RTSP请求,调用...

    高级程序员java考试题库及答案解析

    11. **软件开发方法可归纳为三种模式:基于瀑布模型的结构化生命周期法、基于动态需求定义的原型化方法和面向对象的方法。** - **答案**: Y (正确) - **解析**: 瀑布模型是一种传统的软件开发过程模型,它按照...

Global site tag (gtag.js) - Google Analytics