目录
一、字符流的由来
二、编码表
字符集:
Unicode字符集:
UTF-8编码规则:
三、字符串中的编码解码问题
编码方法(IDEA):
解码方法(IDEA):
四、字符流的编码解码问题
四、字符流写数据的五种方法
五、字符流读数据的两种方法
首页 Java java教程 Java字符流实例分析

Java字符流实例分析

Apr 28, 2023 pm 04:40 PM
java

    一、字符流的由来

    由于使用字节流操控中文时不是很方便,Java就提供了字符流来进行操控中文

    实现原理:字节流+编码表

    为什么用字节流进行复制带有中文的文本文件时没有问题?

    因为底层操作会自动进行字节拼接成中文

    怎样识别该字节是中文呢?

    汉字在存储时,无论是UTF-8还是GBK,第一个字节都是负数用来提示

    二、编码表

    字符集:

    是一个系统支持的所有字符的集合,包括国家文字、标点符号、图形符号、数字等

    计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码

    常见的字符集有ASCII字符集、GBXXX字符集、Unicode字符集等

    GBK:最常用的中文码表,是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等

    GB18030:最新的中文码表,收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国少数民族的文字,同时支持繁体汉字以及日韩汉字等

    Unicode字符集:

    为了表达任意语言的任意字符而设计,是业界的一个标准,也称为统一码、标准万国码;它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案:UTF-8、UTF-16、UTF32,最常用的是UTF-8

    UTF-8:可以用来表示Unicode标准中的任意字符,它是电子邮件、网页及其他存储或传送文件的应用中,优先采用的编码。互联网工作小组要求所有的互联网协议都必须支持UTF-8编码格式。它使用一至四个字节为每个字符编码

    UTF-8编码规则:

    128个US-ASCII字符,只需要一个字节编码

    拉丁文等字符,需要两个字节编码

    大部分常用字(含中文),使用三个字节编码

    其他极少使用的UniCode辅助字符,使用四个字节编码

    总结:编码时使用那种规则,解码就需要采用对应的规则,否则会乱码

    三、字符串中的编码解码问题

    编码方法(IDEA):

    byte[] getBytes():使用平台默认的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

    byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

    解码方法(IDEA):

    String(byte[]bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String

    String(byte[]bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

    IDEA中默认的编码格式是UTF-8

    四、字符流的编码解码问题

    字符流抽象基类:

    Reader:字符输入流的抽象类

    Writer:字符输出流的抽象类

    字符流中和编码解码问题相关的两个类:

    InputStreamReader:是从字节流到字符流的桥梁:它读取字节,并使用指定的字符集将其解码为字符。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

    构造方法:

    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中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    Java 中的完美数 Java 中的完美数 Aug 30, 2024 pm 04:28 PM

    Java 完美数指南。这里我们讨论定义,如何在 Java 中检查完美数?,示例和代码实现。

    Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

    Java 版 Weka 指南。这里我们通过示例讨论简介、如何使用weka java、平台类型和优点。

    Java 中的史密斯数 Java 中的史密斯数 Aug 30, 2024 pm 04:28 PM

    Java 史密斯数指南。这里我们讨论定义,如何在Java中检查史密斯号?带有代码实现的示例。

    Java Spring 面试题 Java Spring 面试题 Aug 30, 2024 pm 04:29 PM

    在本文中,我们保留了最常被问到的 Java Spring 面试问题及其详细答案。这样你就可以顺利通过面试。

    突破或从Java 8流返回? 突破或从Java 8流返回? Feb 07, 2025 pm 12:09 PM

    Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

    Java 中的时间戳至今 Java 中的时间戳至今 Aug 30, 2024 pm 04:28 PM

    Java 中的时间戳到日期指南。这里我们还结合示例讨论了介绍以及如何在java中将时间戳转换为日期。

    Java程序查找胶囊的体积 Java程序查找胶囊的体积 Feb 07, 2025 am 11:37 AM

    胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4

    创造未来:面向零基础的 Java 编程 创造未来:面向零基础的 Java 编程 Oct 13, 2024 pm 01:32 PM

    Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。

    See all articles