文章目录
Pre
庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现
庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片
庖丁解牛:NIO核心概念与机制详解 06 _ 连网和异步 I/O
概述
我们将看一下如何使用 Charsets 处理文本数据
- 为给定的字符编码创建 Charset
- 使用该 Charset 解码和编码文本数据
编码/解码
要读和写文本,我们要分别使用 CharsetDecoder 和 CharsetEncoder。将它们称为 编码器 和 解码器
处理文本的正确方式
从一个文件中读取一些文本,并将该文本写入另一个文件。但是它把该数据当作文本数据,并使用 CharBuffer 来将该数句读入一个 CharsetDecoder 中。同样,它使用 CharsetEncoder 来写回该数据。
假设字符以 ISO-8859-1(Latin1) 字符集(这是 ASCII 的标准扩展)的形式储存在磁盘上。尽管我们必须为使用 Unicode 做好准备,但是也必须认识到不同的文件是以不同的格式储存的,而 ASCII 无疑是非常普遍的一种格式
事实上,每种 Java 实现都要求对以下字符编码提供完全的支持:
- US-ASCII
- ISO-8859-1
- UTF-8
- UTF-16BE
- UTF-16LE
- UTF-16
示例程序
在打开相应的文件、将输入数据读入名为 inputData
的 ByteBuffer
之后,我们的程序必须创建 ISO-8859-1 (Latin1)
字符集的一个实例:
java
Charset latin1 = Charset.forName( "ISO-8859-1" );
然后,创建一个解码器(用于读取)和一个编码器 (用于写入):
java
CharsetDecoder decoder = latin1.newDecoder();
CharsetEncoder encoder = latin1.newEncoder();
为了将字节数据解码为一组字符,我们把 ByteBuffer
传递给 CharsetDecoder
,结果得到一个 CharBuffer
:
java
CharBuffer cb = decoder.decode( inputData );
如果想要处理字符,我们可以在程序的此处进行。但是我们只想无改变地将它写回,所以没有什么要做的。
要写回数据,我们必须使用 CharsetEncoder
将它转换回字节:
java
ByteBuffer outputData = encoder.encode( cb );
在转换完成之后,我们就可以将数据写到文件中了。
Code
java
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class UseCharsets
{
public static void main( String args[] ) throws Exception {
// 指定输入文件和输出文件名称
String inputFile = "samplein.txt";
String outputFile = "sampleout.txt";
// 创建 RandomAccessFile 对象,用于读取和写入文件
RandomAccessFile inf = new RandomAccessFile( inputFile, "r" );
RandomAccessFile outf = new RandomAccessFile( outputFile, "rw" );
long inputLength = new File( inputFile ).length();
// 获取 FileChannel 对象
FileChannel inc = inf.getChannel();
FileChannel outc = outf.getChannel();
// 将文件内容映射到内存缓冲区
MappedByteBuffer inputData =
inc.map( FileChannel.MapMode.READ_ONLY, 0, inputLength );
// 获取 Latin-1 编码解码器
Charset latin1 = Charset.forName( "ISO-8859-1" );
CharsetDecoder decoder = latin1.newDecoder();
CharsetEncoder encoder = latin1.newEncoder();
// 解码内存缓冲区中的数据
CharBuffer cb = decoder.decode( inputData );
// 在此处处理字符数据
// 编码处理后的字符缓冲区数据
ByteBuffer outputData = encoder.encode( cb );
// 将编码后的数据写入文件
outc.write( outputData );
// 关闭资源
inf.close();
outf.close();
}
}
这个程序使用 Java NIO 和字符集处理文件。它将一个文件的内容从拉丁编码(ISO-8859-1)转换为 UTF-8 编码,并将转换后的数据写入另一个文件。
主要步骤如下:
- 指定输入文件和输出文件名称。
- 创建 RandomAccessFile 对象,用于读取和写入文件。
- 将文件内容映射到内存缓冲区。
- 获取拉丁 -1 编码解码器。
- 解码内存缓冲区中的数据。
- 在此处处理字符数据(例如,打印解码后的字符串)。
- 编码处理后的字符缓冲区数据。
- 将编码后的数据写入文件。
- 关闭资源。