• 【Java NIO的深入研究5】字符集Charset


        Java 语言被定义为基于Unicode。一个字符实体由二个字节表示(如果是用UCS-2)。但众多文件和数据流都是基于其它字符编码并以byte传输,操作文件内容就成了一个问题。

        操作一个文件首先要对文件内容进行解码,文件内容是二进制数据(也可以认为是字节流),我们要把内容解码为JAVA可以理解的一个个字符(Unicode)。

        修改完成后还要按输出编码把文件内容编码成对应的二进制内容,再输出到对应地点。

        读取文件内容后要用CharBuffer做decode,才能获取字符内容CharBuffer。

        在写文件之前要用CharsetEncoder做encode,才能获取对应字符编码的二进制内容ByteBuffer。

         

        现在我们将分析这个例子程序 UseCharsets.java。这个程序非常简单 ― 它从一个文件中读取一些文本,并将该文本写入另一个文件。但是它把该数据当作文本数据,并使用 CharBuffer 来将该数句读入一个 CharsetDecoder 中。同样,它使用 CharsetEncoder 来写回该数据。

    示例程序

    在打开相应的文件、将输入数据读入名为 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 );

    在转换完成之后,我们就可以将数据写到文件中了。

    处理文本的正确方式

    我们将假设字符以 ISO-8859-1(Latin1) 字符集(这是 ASCII 的标准扩展)的形式储存在磁盘上。尽管我们必须为使用 Unicode 做好准备,但是也必须认识到不同的文件是以不同的格式储存的,而 ASCII 无疑是非常普遍的一种格式。事实上,每种 Java 实现都要求对以下字符编码提供完全的支持:

    • US-ASCII
    • ISO-8859-1
    • UTF-8
    • UTF-16BE
    • UTF-16LE
    • UTF-16
    public class UseCharsets
    {
      static public void main( String args[] ) throws Exception {
        String inputFile = "samplein.txt";
        String outputFile = "sampleout.txt";
    
        RandomAccessFile inf = new RandomAccessFile( inputFile, "r" );
        RandomAccessFile outf = new RandomAccessFile( outputFile, "rw" );
        long inputLength = new File( inputFile ).length();
    
        FileChannel inc = inf.getChannel();
        FileChannel outc = outf.getChannel();
    
        MappedByteBuffer inputData =
          inc.map( FileChannel.MapMode.READ_ONLY, 0, inputLength );
        //创建 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 );
    
        // Process char data here
       //写回数据,我们必须使用 CharsetEncoder 将它转换回字节:
        ByteBuffer outputData = encoder.encode( cb );
    
        outc.write( outputData );
    
        inf.close();
        outf.close();
      }
    }

    原文件samplein.txt的内容如下:

    
    

    运行结果:将一个文件中读取一些文本,并将该文本写入另一个文件

  • 相关阅读:
    django + dropzone.js 上传文件
    随机知识点---后续整理
    Python项目在Jenkins中的自动化测试实践(语法检查、单元测试,coverage(代码覆盖率)、自动打包)
    my read / zikao / nanjingdaxue
    OS + CentOS kernel parameter
    network / Wireshark
    使用docker部署springBoot并且yml配置文件不打包到jar中
    idea + springBoot项目配置远程调试
    MySql优化建议
    springBoot事务失效导致批量插入性能巨幅降低
  • 原文地址:https://www.cnblogs.com/guweiwei/p/6530956.html
Copyright © 2020-2023  润新知