广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 超详细讲解字符流
  • 638
分享到

Java 超详细讲解字符流

2024-04-02 19:04:59 638人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、字符流的由来二、编码表字符集:Unicode字符集:UTF-8编码规则:三、字符串中的编码解码问题编码方法(idea):解码方法(IDEA):四、字符流的编码解码问题四、字符

一、字符流的由来

由于使用字节流操控中文时不是很方便,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 超详细讲解字符流的文章就介绍到这了,更多相关Java 字符流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 超详细讲解字符流

本文链接: https://www.lsjlt.com/news/145403.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 超详细讲解字符流
    目录一、字符流的由来二、编码表字符集:Unicode字符集:UTF-8编码规则:三、字符串中的编码解码问题编码方法(IDEA):解码方法(IDEA):四、字符流的编码解码问题四、字符...
    99+
    2022-11-13
  • Java超详细讲解IO操作字节流与字符流
    目录IO操作字节流FileInputStreamFileOutputStream字节流读写案例字符流FileReaderFileWriter字节流与字符流的区别IO操作 字节流 ...
    99+
    2022-11-13
  • C++超详细讲解字符串类
    目录一、历史遗留问题二、解决方案三、标准库中的字符串类四、字符串循环右移五、小结一、历史遗留问题 C 语言不支持真正意义上的字符串C 语言用字符数组和一组函数实现字符串操作C 语言不...
    99+
    2022-11-13
  • C语言超详细讲解字符串相乘
    目录前言一、分析思路二、使用步骤1、代码如下2、memset函数三、总结前言 我们已经知道,正常的两位整形数据通过*相乘,C语言中int为4字节,32bit(字节),其机器码第一位为...
    99+
    2022-11-13
  • java反射超详细讲解
    目录Java反射超详解✌1.反射基础1.1Class类1.2类加载2.反射的使用2.1Class对象的获取2.2Constructor类及其用法2.4Method类及其用...
    99+
    2022-11-12
  • 超详细讲解Java异常
    目录一、Java异常架构与异常关键字Java异常简介Java异常架构1、Throwable2、Error(错误)3、Exception(异常)4、受检异常与非受检异常Java异常关键...
    99+
    2022-11-12
  • Java超详细讲解hashCode方法
    目录1、介绍一下hashCode方法2、为什么需要hashCode方法?3、hashCode(),equals()两种方法是什么关系?4、为什么重写 equals 方法必须重...
    99+
    2022-11-13
  • 超详细讲解Java线程池
    目录池化技术池化思想介绍池化技术的应用如何设计一个线程池Java线程池解析ThreadPoolExecutor使用介绍内置线程池使用ThreadPoolExecutor解析整体设计线...
    99+
    2022-11-12
  • Java超详细透彻讲解static
    目录1. 引入2. 理解3. 使用3.1 使用范围3.2 static修饰属性3.2.1 设计思想3.2.2 分类3.2.3 注意3.2.4 举例3.2.5 类变量内存解析3.3 s...
    99+
    2022-11-13
  • Spring超详细讲解创建BeanDefinition流程
    目录一、前期准备1.1 环境依赖1.2 实体类1.3 applicationContext.xml1.4 测试代码二、探究过程2.1 目标2.2 BeanDefinition的创建过...
    99+
    2022-11-13
  • Python 字符串str详解(超详细)
    文章目录 Python内置函数/方法详解—字符串str1、创建字符串1.1 使用 ' ' 或 " " 创建字符串1.2 使用 str()函数 转换为字符串 2、访问字符串2.1 下标索引...
    99+
    2023-10-22
    python 开发语言 pycharm 后端 算法
  • C++超详细讲解运算符重载
    目录概念赋值运算符重载const成员取地址及const取地址操作符重载概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名...
    99+
    2022-11-13
  • C++超详细讲解逻辑操作符
    目录一、逻辑运算符的原生语义二、重载逻辑操作符三、小结一、逻辑运算符的原生语义 操作数只有两种值( true和 false )逻辑表达式不用完全计算就能确定最终值最终结果只能是 tr...
    99+
    2022-11-13
  • Python海象运算符超详细讲解
    目录介绍语法用法if 语句while 循环while 循环逐行读取文件while 循环验证输入推导式三元表达式总结介绍 海象运算符,即 := ,在 PEP 572 中被提出,并在 P...
    99+
    2023-01-30
    Python海象运算符 Python海象运算符作用
  • C++超详细讲解逗号操作符
    目录一、逗号操作符二、重载逗号操作符三、小结一、逗号操作符 逗号操符( , )可以构成逗号表达式 逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号...
    99+
    2022-11-13
  • Java的Stream流详细讲解
    一.Stream 是什么 Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响。 ​ 同时stream不是...
    99+
    2023-08-31
    java 开发语言
  • SpringCloudNetflixRibbon超详细讲解
    目录一、Ribbon简介1、什么是Ribbon2、Ribbon能干什么二、使用Ribbon1、客户端导入依赖2、application.yml配置3、Controller配置4、Co...
    99+
    2022-11-13
    SpringCloud Netflix Ribbon SpringCloud Ribbon
  • AndroidLayerDrawable超详细讲解
    目录1. 前言2. 实例1. 前言 Android LayerDrawble 包含一个Drawable数组,系统将会按照这些Drawable对象的数组顺序来绘制他们,索引最大的 Dr...
    99+
    2022-11-13
    Android LayerDrawable Android LayerDrawable原理
  • AndroidSwipeRefreshLayout超详细讲解
    目录1. 控件说明2. API介绍3. 使用方法3.1 布局文件3.2 界面代码4. 注意事项1. 控件说明 SwipeRefreshLayout是google官方推荐使用的下拉刷新...
    99+
    2022-11-13
    Android SwipeRefreshLayout Android SwipeRefreshLayout控件
  • Redis中String字符串和sdshdr结构体超详细讲解
    目录前言sdslen讲解sdsnewlen讲解总结前言 在redis中对字符串的处理,个人觉得特别的优雅,所以特意写这篇帖子来分享一下对其的理解。 struct sdshdr { ...
    99+
    2023-05-15
    Redis String字符串 Redis sdshdr结构体
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作