Java学习笔记31——字符流

字符流

  • 字符流
    • 为什么出现字符流
    • 编码表
    • 字符串中的编码解码问题
    • 字符流写数据的5中方式
    • 字符流读数据的两种方式
    • 字符流复制Java文件

字符流

为什么出现字符流

汉字的存储如果是GBK编码占用2个字节,如果是UTF-8占用三个字节

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,识别的方法是:
汉字在编码时,不论是那种编码方式,第一个字节都是负数

由于字节流操作中文不是特别的方便,所以Java提供字符流

字符流=字节流+编码表

编码表

计算机中储存的信息都是二进制数表示的,从屏幕上看到的都是二进制数转换后的结果

编码:按照某种规则将字符存在计算机中
解码:将储存在计算机中的二进制数按照某种规则解析

  1. ASCII字符集:**用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)
    **
    基本的ASCII字符集用7位表示,总共128个字符
    拓展的用8位,共256个字符,方便支持欧洲常用字符

  2. GBXXX字符集:
    a. GB2312:简体中文码表。一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名等都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字书长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了
    b. GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及曰韩汉字等
    c. GB18030∶最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,筒时支持繁体汉字以及日韩汉字等

  3. Unicode字符集:为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF32。最为常用的UTF-8编码。
    **UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码
    **
    编码规则
    a. 128个US-ASCIl字符,只需一个字节编码拉丁文等字符,需要二个字书编码
    b. 大部分常用字(含中文),使用三个字节编码
    c. 其他极少使用的Unicode辅助字符,使用四字节编码

**采用何种规则编码,就要采用对应规则解码,否则就会出现乱码
**

字符串中的编码解码问题

编码

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

解码

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

用GBK编码,utf-8解码乱码

public class StringDemo {public static void main(String[] args) throws UnsupportedEncodingException {String s="中国";
//        byte[] bys=s.getBytes();//[-28, -72, -83, -27, -101, -67]
//        byte[] bys=s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]byte[] bys=s.getBytes("GBK");//[-42, -48, -71, -6]String ss=new String(bys);System.out.println(ss);String sss=new String(bys,"GBK");System.out.println(sss);}
}

用同样的方式编解码,正常

字符流写数据的5中方式

方法名说明
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)写入字符串的一部分

字符流读数据的两种方式

方法名说明
int read()一次读一个字符
int read(char[], cbuf)一次读一个字符数组数据

字符流复制Java文件


public class CopyJavaDemo01 {public static void main(String[] args) throws IOException {//创建字符输入流对象InputStreamReader isr= new InputStreamReader(new FileInputStream("test.java"));OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("Copy.java"));
//     读写复制
//      一次读一个字符数据int ch;while((ch=isr.read())!=-1){osw.write(ch);}
//      一次读写一个字符数组char[] chs=new char[1024];int len;while ((len=isr.read(chs))!=-1){osw.write(chs,0,len);}
//      释放资源isr.close();osw.close();}
}

转换流的名字比较长,常见操作都是按照本地默认编码实现,为了简化书写,转换流提供了对应的子类

FileReader继承自InputStreamReader,读取字符文件的便捷类

FileWriter继承自OutputStreamWriter,读取字符文件的便捷类

public class CopyJavaDemo02 {public static void main(String[] args) throws IOException {FileReader fr=new FileReader("test.java");FileWriter fw=new FileWriter("copy02.java");int ch;while ((ch= fr.read())!=-1){fw.write(ch);}fr.close();fw.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/99234.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于linux openssl的自签证书认证与nginx配置

自签文档链接 重点注意这块,不能写一样的,要是一样的话登录界面锁会报不安全 域名这块跟最后发布的一致 nginx配置的话 server {listen 443 ssl; //ssl 说明为https 默认端口为443server_name www.skyys.com; //跟openssl设置的域名保持一致s…

C# void 关键字学习

C#中void关键字是System.Void的别名; 可以将 void 用作方法(或本地函数)的返回类型来指定该方法不返回值; 如果C#方法中没有参数,则不能将void用作参数;这是与C语言不同的,C语言有…

Android之 Canvas绘制

一 Canvas介绍 1.1 Canvas 是绘制图形的重要类之一,它可以在 View 或 SurfaceView 上绘制各种图形和文本. 1.2 要创建 Canvas,首先需要有一个 View 或 SurfaceView 对象,在 View 或 SurfaceView 的绘制方法中,可以通过 Canvas 的…

基于Python+DenseNet121算法模型实现一个图像分类识别系统案例

目录 介绍在TensorFlow中的应用实战案例最后 一、介绍 DenseNet(Densely Connected Convolutional Networks)是一种卷积神经网络(CNN)架构,2017年由Gao Huang等人提出。该网络的核心思想是密集连接,即每…

Python 3.x标准数据类型

文章目录 一、数字1.1 基本的数字类型有:1.2 整数数字表示方式二、字符串2.1 操作符2.2 格式化百分号format 格式化输出位置匹配2.3 字符串 索引和切片2.4 切片:字符串 [ 起始索引:终止索引:步长 ]字符串连接操作三、列表3.1 列表的定义3.2 常用方法(功能:增删改查)增删除…

uniapp 项目实践总结(二)从零开始搭建一个项目

导语:本篇文章主要是项目方面的技术开发总结,新建一个项目可以选择使用可视化界面,也可以使用命令行搭建。 目录 可视化界面命令行搭建安卓开发环境苹果开发环境可视化界面 安装软件 使用官方推荐的 HbuilderX 软件,开发方式比较简单,内置相关环境以及终端,无需配置 no…

【STM32】锁存器

问题背景 在学习FSMC控制外部NOR存储器时,看到在NOR复用接口模式下,AD信号[15:0]是复用的。也就是说,若不使用锁存器:当NADV为低时,ADx(x0…15)上出现地址信号Ax,当NADV变高时,ADx上出现数据信号Dx。若使用…

【C语言】——调试技巧

目录 ​编辑 ①前言 1.什么是Bug? 2.什么是调试? 2.1调试的基本步骤 2.2Release与Debug 3.常用快捷键 4.如何写出好的代码 4.1常见的coding技巧 👉assert() 👉const() const修饰指针: ①前言 调试是每个程序员都…

MySQL的Json类型个人用法详解

前言 虽然MySQL很早就添加了Json类型,但是在业务开发过程中还是很少设计带这种类型的表。少不代表没有,当真正要对Json类型进行特定查询,修改,插入和优化等操作时,却感觉一下子想不起那些函数怎么使用。比如把json里的…

上线检查工具(待完善)

根据V11《CEBPM系统上线CheckList》整理而得,适用于V11,DHERP,Oracle和MSSQL数据库,检查内容还不完善。 上图: 1)数据库连接 2)双击[连接别名],可选择历史连接 3)主界面…

时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来

时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现PSO-LSSVM时间序列预测未…

自然语言处理实战项目17-基于多种NLP模型的诈骗电话识别方法研究与应用实战

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目17-基于NLP模型的诈骗电话识别方法研究与应用,相信最近小伙伴都都看过《孤注一掷》这部写实的诈骗电影吧,电影主要围绕跨境网络诈骗展开,电影取材自上万起真…