ホームページ  >  記事  >  Java  >  Java 文字ストリームの例の分析

Java 文字ストリームの例の分析

王林
王林転載
2023-04-28 16:40:071104ブラウズ

    #1. 文字ストリームの起源

    中国語を制御するためにバイト ストリームを使用するのはあまり便利ではないため、Java は中国語を制御するための文字ストリームを提供します

    実装原理: バイト ストリーム エンコード テーブル

    #バイト ストリームを使用して中国語の文字を含むテキスト ファイルをコピーすると問題がないのはなぜですか?

    基礎となる操作によりバイトが自動的に中国語に結合されるため

    バイトが中国語であることを識別するにはどうすればよいでしょうか?

    漢字を格納する場合、UTF-8 であろうと GBK であろうと、最初のバイトはプロンプトを表示するための負の数です。

    2. コード表

    文字セット:

    は、国別文字、句読点、グラフィック記号、数字など、システムでサポートされているすべての文字のコレクションです。

    さまざまな文字セット記号を正確に保存して認識するには、コンピューターは次のことを行う必要があります。文字処理を実行します。 エンコーディング。文字セットのセットには、少なくとも 1 つの文字エンコーディング セットが必要です。

    一般的な文字セットには、ASCII 文字セット、GBXXX 文字セット、Unicode 文字セットなどが含まれます。

    GBK : 最も一般的に使用される中国語コード テーブル。GB2312 標準に基づいた拡張仕様です。2 バイト エンコーディング スキームを使用し、合計 21,003 の中国語文字が含まれています。GB2312 標準と完全に互換性があり、繁体字中国語文字をサポートしています。 、日本語、韓国語の中国語文字など

    GB18030: 最新の中国語 コード テーブルには、マルチバイト エンコーディングを使用した 70244 個の中国語文字が含まれており、各文字は 1、2、または 4 バイトで構成されます。

    Unicode 文字セット:

    は、あらゆる言語のあらゆる文字を表現できるように設計されています。 Unicode および Standard Universal Code とも呼ばれる業界の標準であり、最大 4 バイトの数字を使用して各文字、記号、またはテキストを表現します。エンコード スキームには、UTF-8、UTF-16、UTF32 の 3 つがあります。最も一般的に使用されるのは UTF-8

    UTF-8 です。これは、Unicode 標準の任意の文字を表すために使用できます。電子メール、Web ページ、およびファイルを保存または転送する他のアプリケーションで使用される優先エンコーディングに使用されます。インターネット ワーキング グループは、すべてのインターネット プロトコルが UTF-8 エンコード形式をサポートすることを要求しています。各文字のエンコードに 1 ~ 4 バイトを使用します。

    UTF-8 エンコード ルール:

    128 US-ASCII 文字、エンコードは 1 バイトのみ必要です

    ラテン語中国語およびその他文字のエンコードには 2 バイトが必要です

    最も一般的に使用される文字 (中国語を含む) のエンコードには 3 バイトが使用されます

    まれに使用されるその他の UniCode 補助文字は 4 文字が使用されます セクション エンコード

    概要:エンコード時にどのルールが使用され、デコードには対応するルールを使用する必要があります。そうしないとコードが文字化けします

    3. 文字列のエンコードとデコードの問題

    エンコード方法 (IDEA):

    byte[] getBytes(): プラットフォームのデフォルトの文字セットを使用して文字列を一連のバイトにエンコードし、結果を新しいバイト配列に格納します

    byte[] getBytes(String charsetName): 指定された文字セットを使用して文字列を一連のバイトにエンコードし、結果を新しいバイト配列に格納します。

    デコード メソッド (IDEA):

    String(byte[] bytes): プラットフォームのデフォルトの文字セットを使用して、指定されたバイト配列をデコードすることにより、新しい String を構築します。

    String(byte[]bytes,String charsetName): プラットフォームのデフォルトを使用して、指定されたバイト配列をデコードすることにより、新しい String を構築します。文字セット 指定されたバイト配列をデコードして新しい String を構築します

    IDEA のデフォルトのエンコード形式は UTF-8

    4 です。文字ストリームのエンコードとデコードの問題

    文字ストリーム抽象化 基本クラス:

    Reader: 文字入力ストリームの抽象クラス

    Writer: 文字出力ストリームの抽象クラス

    文字ストリームのエンコードとデコードの問題に関連する 2 つのクラス:

    InputStreamReader: バイト ストリームから文字ストリームへのブリッジです。バイトを読み取り、指定された文字セットを使用して文字にデコードします。使用する文字セットは、名前で指定することも、明示的に指定することも、プラットフォームのデフォルトの文字セットを受け入れることもできます。 in)

    デフォルトの文字セットを使用して、InputStreamReader を作成します。

    InputStreamReader(InputStream in, String charsetName)名前付き文字セットを使用する InputStreamReader を作成します。
    OutputStreamWruter: 文字ストリームからバイト ストリームへのブリッジです。カスタム文字セットを使用して、書き込まれた文字をバイトにエンコードします。使用する文字セットは、名前で指定できます。 、明示的に指定することも、プラットフォームのデフォルトの文字セットを受け入れることもできます。 構築メソッド:

    OutputStreamWriter(OutputStream out)

    Createデフォルトの文字エンコーディングを使用する OutputStreamWriter。

    OutputStreamWriter(OutputStream out, String charsetName)名前付き文字セットを使用する OutputStreamWriter を作成します。
    public class ConversionStreamDemo {
        public static void main(String[] args) throws IOException {
            //创建一个默认编码格式的InputStreamReader\OutputStreamWriter
            InputStreamReader ipsr = new InputStreamReader(new FileInputStream("E:\\abc.txt"));
            OutputStreamWriter opsw = new OutputStreamWriter(new FileOutputStream("E:\\abc.txt"));
            //写入数据
            opsw.write("你好啊");
            opsw.close();
            //读数据,方式一:一次读取一个字节数据
            int ch;
            while ((ch = ipsr.read()) != -1) {
                System.out.print((char) ch);
            }
            ipsr.close();
    
        }
    }

    四、字符流写数据的五种方法

    方法名 说明
    void write(int c)     写一个字符
    void write(char[] cbuf) 写入一个字符数组
    void write(char[] cbuf,int off,int len) 写入字符数组的一部分
    void write(String str) 写入一个字符串
    void write(String str,int off,int len) 写入一个字符串的一部分

    字符流写数据需要注意缓冲区的问题,如果想要将缓冲区的数据加载出来需要在写入方法后加上刷新方法flush();

    前三个方法与字节流写入方法使用相同,这里重点介绍下面两种方式

    public class OutputStreamWriterDemo {
        public static void main(String[] args) throws IOException {
            //创建一个默认编码格式的OutputStreamWriter对象
            OutputStreamWriter opsw=new OutputStreamWriter(new FileOutputStream("E:\\abc.txt"));
            //方式一:写入一个字节
            opsw.write(97);
            opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
            //方式二:写入一个字符数组
            char[]ch={'a','b','c','二'};
            opsw.write(ch);
            opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
            //方式三:写入一个字符数组的一部分
            opsw.write(ch,0,2);
            opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
            //方式四:写入一个字符串
            opsw.write("一二三");
            opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
            //方式五:写入一个字符串的一部分
            opsw.write("三四五",1,2);
            opsw.flush();//如果需要在文件中立即显示输入的数据,就需要加入刷新方法
        }
    }

    五、字符流读数据的两种方法

    方法名 说明
    int read()     一次读取一个字符数据
    int read(char[] cbuf) 一次读取一个字符数组数据
    public class InputStreamReadDemo {
        public static void main(String[] args) throws IOException {
            //创建一个默认编码格式的InputStreamReader
            InputStreamReader ipsr=new InputStreamReader(new FileInputStream("E:\\abc.txt"));
            //读取数据,方式一一次读取一个字符数据
            int ch;
            while ((ch=ipsr.read())!=-1){
                System.out.print((char) ch);
            }
            ipsr.close();
            //方式二:一次读取一个字符数组数据
            char []ch=new char[1024];
            int len;
            while ((len=ipsr.read(ch))!=-1){
                System.out.print(new String(ch,0,len));
            }
            ipsr.close();
        }
    }

    小结:如果使用默认编码格式的话,那么字符输入流InputStreamReader可以使用子类FileReader来替代,字符输出流OutputStreamWriter可以使用其子类FileWriter来替代,两者在使用默认编码格式的情况下作用一致。

    以上がJava 文字ストリームの例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。