作者: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>