Java NIO学习7(字符集)

根据 Sun 的文档,一个 Charset 是“十六位 Unicode 字符序列与字节序列之间的一个命名的映射”。实际上,一个Charset 允许您以尽可能最具可移植性的方式读写字符序列。

Java 语言被定义为基于 Unicode。然而在实际上,许多人编写代码时都假设一个字符在磁盘上或者在网络流中用一个字节表示。这种假设在许多情况下成立,但是并不是在所有情况下都成立,而且随着计算机变得对 Unicode 越来越友好,这个假设就日益变得不能成立了。

(Ps:  java中的char字符占两个字节,就是因为java采用的unicode,unicode是占用两个字节的,是定长的,而utt-8 是变长编码,即变长的Unicode码,在Unicode码基础上进行编程的,中文占3个字节


编码/解码
要读和写文本,我们要分别使用 CharsetDecoder 和 CharsetEncoder。将它们称为 编码器和 解码器是有道理的。一个 字符不再表示一个特定的位模式,而是表示字符系统中的一个实体。因此,由某个实际的位模式表示的字符必须以某种特定的 编码来表示。
CharsetDecoder 用于将逐位表示的一串字符转换为具体的 char 值。同样,一个 CharsetEncoder 用于将字符转换回位。

处理文本的正确方式
现在我们将分析这个例子程序 UseCharsets.java。这个程序非常简单 ― 它从一个文件中读取一些文本,并将该文本写入另一个文件。但是它把该数据当作文本数据,并使用 CharBuffer 来将该数句读入一个 CharsetDecoder 中。
同样,它使用 CharsetEncoder 来写回该数据。
我们将假设字符以 ISO-8859-1(Latin1) 字符集(这是 ASCII 的标准扩展)的形式储存在磁盘上。尽管我们必须为使用 Unicode 做好准备,但是也必须认识到不同的文件是以不同的格式储存的,而 ASCII 无疑是非常普遍的一种格式。事实上,每种 Java 实现都要求对以下字符编码提供完全的支持:
 US-ASCII
 ISO-8859-1
 UTF-8
 UTF-16BE
 UTF-16LE
 UTF-16

public static void main(String[] args) throws Exception {
		String inputFile = UseCharset.class.getClassLoader()
				.getResource("a.txt").getFile();
		String outFile = UseCharset.class.getClassLoader().getResource("b.txt")
				.getFile();

		RandomAccessFile inf = new RandomAccessFile(inputFile, "r");
		RandomAccessFile outf = new RandomAccessFile(outFile, "rw");

		long length = new File(inputFile).length();

		FileChannel inc = inf.getChannel();
		FileChannel outc = outf.getChannel();

		MappedByteBuffer inputData = inc.map(FileChannel.MapMode.READ_ONLY, 0,
				length);
		
		// 在打开相应的文件、将输入数据读入名为 inputData 的 ByteBuffer 之后,我们的程序必须创建 ISO-8859-1
		// (Latin1) 字符集的一个实例:
		Charset latin1 = Charset.forName("ISO-8859-1");
	
		// 创建一个解码器(用于读取)和一个编码器 (用于写入):
		CharsetDecoder decoder = latin1.newDecoder();
		CharsetEncoder encoder = latin1.newEncoder();
	
		// 为了将字节数据解码为一组字符,我们把 ByteBuffer 传递给 CharsetDecoder,结果得到一个 CharBuffer:
		CharBuffer cb = decoder.decode(inputData);

		// 如果想要处理字符,我们可以在程序的此处进行。但是我们只想无改变地将它写回,所以没有什么要做的。
		// 要写回数据,我们必须使用 CharsetEncoder 将它转换回字节:
		ByteBuffer outputData = encoder.encode(cb);

		outc.write(outputData);

		inf.close();
		outf.close();
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值