>  기사  >  Java  >  Java 문자 스트림 예제 분석

Java 문자 스트림 예제 분석

王林
王林앞으로
2023-04-28 16:40:071049검색

    1. 문자 스트림의 기원

    바이트 스트림을 사용하여 중국어를 제어하는 ​​것은 그리 편리하지 않기 때문에 Java는 중국어를 제어하기 위해 문자 스트림을 제공합니다.

    구현 원리: 바이트 스트림 + 인코딩 테이블

    사용 이유 바이트 스트림에 한자가 포함된 텍스트 파일을 복사할 때 문제가 있습니까?

    기본 작업이 자동으로 바이트를 중국어로 분할하기 때문입니다.

    바이트가 중국어인지 어떻게 식별할 수 있나요?

    한자가 저장될 때 UTF-8이든 GBK이든 첫 번째 바이트는 음수로 프롬프트됩니다.

    2. 인코딩 테이블

    문자 집합:

    은 시스템에서 지원하는 모든 문자의 집합입니다. 국가 문자, 문장 부호, 그래픽 기호, 숫자 등을 포함합니다.

    다양한 문자 집합 기호를 정확하게 저장하고 인식하려면 컴퓨터에서 문자 인코딩을 수행해야 합니다. 문자 집합에는 하나 이상의 문자 인코딩 집합이 있어야 합니다.

    일반적인 문자 세트에는 ASCII 문자 세트, GBXXX 문자 세트, 유니코드 문자 세트 등이 포함됩니다.

    GBK: 가장 일반적으로 사용되는 중국어 코드 테이블은 GB2312 표준을 기반으로 하는 확장 사양이며 더블바이트 인코딩 체계를 사용합니다. 총 21,003개의 중국어 문자가 GB2312 표준과 완벽하게 호환되며 중국어 번체, 일본어 및 한국어 한자 등도 지원합니다.

    GB18030: 멀티바이트 인코딩을 사용하여 70244개의 한자를 포함하는 최신 중국어 코드 테이블입니다. 각 문자는 1, 2 또는 4바이트로 구성될 수 있습니다. 중국 소수민족의 문자는 물론 번체자, 일본어, 한국어 한자 등을 지원합니다.

    유니코드 문자 세트:

    모든 언어의 모든 문자를 표현하도록 설계되었으며 업계 표준이기도 합니다. 유니코드 및 표준 유니코드로 각 문자, 기호 또는 텍스트를 표시하기 위해 최대 4바이트의 숫자를 사용합니다. UTF-8, UTF-16, UTF32의 세 가지 인코딩 방식이 있습니다. 가장 일반적으로 사용되는 것은 UTF-8

    UTF-8입니다. 유니코드 표준의 모든 문자를 나타내는 데 사용할 수 있습니다. 페이지 및 기타 저장 또는 전송 파일 응용 프로그램에서는 인코딩이 선호됩니다. 인터넷 작업 그룹에서는 모든 인터넷 프로토콜이 UTF-8 인코딩 형식을 지원해야 한다고 요구합니다. 각 문자를 인코딩하는 데 1~4바이트를 사용합니다.

    UTF-8 인코딩 규칙:

    128 US-ASCII 문자, 인코딩하는 데 1바이트만 필요합니다.

    라틴 문자 및 기타 문자를 인코딩하는 데 2바이트가 필요합니다.

    가장 일반적으로 사용되는 문자 (중국어 포함)은 3바이트로 인코딩됩니다

    기타 거의 사용되지 않는 UniCode 보조 문자는 4바이트로 인코딩됩니다

    요약: 인코딩 시 어떤 종류의 규칙이 사용되며, 디코딩 시 해당 규칙을 사용해야 합니다. 그렇지 않으면 왜곡됩니다.

    3. 문자열의 인코딩 및 디코딩 문제

    인코딩 방법(IDEA):

    byte[] getBytes(): 플랫폼의 기본 문자 집합을 사용하여 문자열을 일련의 바이트로 인코딩하고 결과를 새 바이트 배열

    byte[] getBytes(String charsetName): 지정된 문자 세트를 사용하여 문자열을 일련의 바이트로 인코딩하고 결과를 새 바이트 배열에 저장합니다

    Decoding 메서드(IDEA ):

    String( byte[]bytes): 플랫폼의 기본 문자 집합을 사용하여 지정된 바이트 배열을 디코딩하여 새 문자열을 구성합니다.

    String(byte[]bytes,String charsetName): 플랫폼의 기본 문자 집합을 사용하여 지정된 바이트 배열을 디코딩하여 바이트 배열을 구성합니다. 새로운 문자열

    IDEA의 기본 인코딩 형식은 UTF-8

    IV입니다. 문자 스트림 인코딩 및 디코딩 문제

    문자 스트림 추상 기본 클래스:

    Reader: 문자 입력 스트림의 추상 클래스

    Writer: 추상 클래스 문자 출력 스트림

    문자 스트림의 인코딩 및 디코딩 문제와 관련된 두 가지 클래스:

    InputStreamReader: 바이트 스트림에서 문자 스트림으로의 브리지입니다. 바이트를 읽고 지정된 문자 세트를 사용하여 문자로 디코딩합니다. 사용하는 문자 집합은 이름으로 지정하거나 명시적으로 지정할 수 있거나 플랫폼의 기본 문자 집합을 허용할 수 있습니다.

    Constructor 메서드:

    InputStreamReader(InputStream in) 기본 문자 집합을 사용하는 InputStreamReader 만들기 .
    InputStreamReader(InputStream in, String charsetName) 이름이 지정된 문자 집합을 사용하는 InputStreamReader를 만듭니다.

    OutputStreamWruter: 문자 스트림에서 바이트 스트림으로의 연결입니다. 사용자 정의 문자 세트를 사용하여 작성된 문자를 바이트로 인코딩합니다. 사용하는 문자 세트는 이름으로 지정하거나 명시적으로 지정할 수 있습니다. 플랫폼의 기본 문자 집합

    구성 방법:

    OutputStreamWriter(OutputStream out) 기본 문자 인코딩을 사용하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제