`
flyingis
  • 浏览: 290228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java I/O中的数据编码转换

阅读更多

作者:Flyingis

      JDK1.4
开始便引入了java.nio.*包,其目的在于提高I/O的速度,这是因为该类库使用的结构更接近于操作系统执行I/O的方式,即通过通道和缓冲器来读写数据。在实际应用中,和我们直接交互的是缓冲器,然后把缓冲器派送到通道,通道要么从缓冲器获得数据,要么向缓冲器发送数据。
<!----><o:p></o:p>


    在基于
Java的各种开发中,字符编码是常见的问题之一,在最基本的Java I/O中也存在这种问题。新的Java I/O通过通道和缓冲器来读写数据,缓冲器容纳的是普通的字节,为了把它们转换成字符,我们要么在输入的时候对其进行编码,要么在从缓冲器输出时对它们进行解码。
<o:p></o:p>


import java.io.*;<o:p></o:p>

import java.nio.*;<o:p></o:p>

import java.nio.channels.*;<o:p></o:p>

import java.nio.charset.*;<o:p></o:p>

public class ByteToCharacter {<o:p></o:p>

  private static final int SIZE = 1024;<o:p></o:p>

  public static void main(String[] args) throws Exception {<o:p></o:p>

FileChannel fc = new FileOutputStream(“Output.txt”).getChannel();<o:p></o:p>

ByteBuffer buffer = ByteBuffer.allocate(SIZE);<o:p></o:p>

/**<o:p></o:p>

* 在输入的时候进行编码方式一<o:p></o:p>

*/<o:p></o:p>

fc.write(ByteBuffer.wrap(“Good holiday!”.getBytes(“UTF-16BE”)));  // UTF-16BE可以更换为其他编码方式

fc.close();<o:p></o:p>

fc = new FileInputStream(“Output.txt”).getChannel();<o:p></o:p>

fc.read(buffer);<o:p></o:p>

buffer.flip();  //准备从缓冲区读取已经写入的数据<o:p></o:p>

System.out.println(buffer.asCharBuffer());<o:p></o:p>

/**<o:p></o:p>

* 在输入的时候进行编码方式二<o:p></o:p>

* 通过asCharBuffer()方法直接以char形式将字符写入<o:p></o:p>

*/<o:p></o:p>

fc = new FileOutputStream(“Output.txt”).getChannel();<o:p></o:p>

buffer.clear();<o:p></o:p>

buffer.asCharBuffer.put(“Good holiday has passed!”);<o:p></o:p>

fc.write(buffer);<o:p></o:p>

fc.close();<o:p></o:p>

fc = new FileInputStream(“Output.txt”).getChannel();<o:p></o:p>

buffer.clear();<o:p></o:p>

fc.read(buffer);<o:p></o:p>

buffer.flip();<o:p></o:p>

System.out.println(buffer.asCharBuffer());<o:p></o:p>

/**<o:p></o:p>

* 从缓冲器输出时进行编码<o:p></o:p>

*/<o:p></o:p>

fc = new FileOutputStream(“Output.txt”).getChannel();<o:p></o:p>

fc.write(ByteBuffer.wrap(“Once again!”.getBytes()));<o:p></o:p>

fc.close();<o:p></o:p>

fc = new FileInputStream(“Output.txt”).getChannel();<o:p></o:p>

buffer.clear();<o:p></o:p>

fc.read(buffer);<o:p></o:p>

buffer.flip();<o:p></o:p>

String encode = System.getProperty(“file.encoding”);  // 平台缺省字符集,更加通用的方法,跨平台特性的体现之一

System.out.println(Charset.forName(encode).decode(buffer));<o:p></o:p>

}<o:p></o:p>

}
<o:p></o:p>


   
在上述代码中,如果不对从缓冲器写入的数据进行正确编码,那么当再次通过缓冲器读取这些数据时,将不能显示任何所需要的数据。
<o:p></o:p>


    JDK
中的java.nio.charset.Charset类提供了把数据编码成多种不同类型的字符集的工具,满足在各种应用中的编码需求。<o:p></o:p>

分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    JavaAPI1.6中文chm文档 part1

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    Java 1.6 API 中文 New

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。...

    java jdk-api-1.6 中文 chmd

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    java api最新7.0

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。...

    JavaAPI中文chm文档 part2

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    java面试题大全--java基础,struts,spring,ejb等

    8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet...

    Thinking in java4(中文高清版)-java的'圣经'

    类型信息 第15章 泛型 第16章 数组 第17章 容器深入研究 第18章 Java I/O系统 第19章 枚举类型 第20章 注解 第21章 并发 第22章 图形化用户界面 附录A 补充材料 可下载的补充材料 Thinking in C:Java的基础 Java...

    java nio.doc

     I/O 设施。  java.nio 包定义了缓冲区类,这些类用于所有 NIO API。java.nio.charset 包中定义了字符集 API,java.nio.channels 包中定义了信道和选择器 API。每个子包都具有自己的服务提供程序接口 (SPI) 子包,...

    [Java参考文档]

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    [Java参考文档].JDK_API 1.6

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    JAVA面试题最全集

    编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet...

    Java语言基础下载

    Java编码约定 56 运算符的优先级 58 升级和表达式的类型转换 62 独立实践 70 第五章:数组 71 学习目标 71 数组的描述 72 创建数组 72 多维数组 78 拷贝数组 80 内容总结 83 独立实践 84 第六章:继承 86 学习目标:...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    1_6_zh_CN.CHM

    java.applet 提供创建 applet 所必需的类和 applet 用来与其 ...java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。

Global site tag (gtag.js) - Google Analytics