java基础学习——字符流

1.为什么会出现字符流:

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

                字符流=字节流+编码表

        用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

        汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

2.编码表:

基础知识:

        计算机中存储的信息都是以二进制数表示的;我们在屏幕上看到的英文,汉字等字符是二进制数转化之后的结果

        按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。这里强调一下:按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符合。否则就会导致乱码现象

        字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A,65)

        字符集

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

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

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

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

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

Unicode字符集:

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

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

        编码规则:

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

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

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

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

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

编码:

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

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

解码:

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

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

3.字符流中的编码解码问题:

字符流抽象基类

Reader:字符输入流的抽象类

Writer:字符输出流的抽象类

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

        InputStreamReader

        OutputStreamWriter

package com.aynu9;

import java.io.*;

public class ConversionStreamDemo {
    public static void main(String[] args) throws IOException {
        //OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter.
        //OutputStreamWriter(OutputStream out,String charsetName) 创建一个使用命名字符集的OutputStreamWriter.
//        FileOutputStream fos=new FileOutputStream("myMap\\osw.txt");
//        OutputStreamWriter osw=new OutputStreamWriter(fos);
//        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\idea1\\workplace\\myMap\\osw.txt"));
//        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\idea1\\workplace\\myMap\\osw.txt"), "UTF-8");
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\idea1\\workplace\\myMap\\osw.txt"), "GBK");
        osw.write("中国");

        osw.close();

        //InputStreamReader (InputStream in) 创建一个使用默认字符集的InputStreamReader。
        //InputStreamReader (InputStream in, String charsetName) 创建一个使用命名字符集的InputStreamReader。
//        InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\idea1\\workplace\\myMap\\osw.txt"));
        InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\idea1\\workplace\\myMap\\osw.txt"),"GBK");

        //一次读取一个字符数据
        int ch;
        while((ch=isr.read())!=-1){
            System.out.print((char)ch);
        }
        isr.close();
    }
}

 中国

 4.字符流写数据的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)写一个字符串的一部分
package com.aynu9;

//构造方法
//OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter.

//写数据的五种方法
//        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)	写一个字符串的一部分


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterDemo {
    public static void main(String[] args) throws IOException {

        //OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\idea1\\workplace\\myMap\\osw.txt"));

        //        void write(int c)	写一个字符
//        osw.write(97);
//        //void flush();刷新流
//        osw.flush();
//        osw.write(98);
//        osw.flush();
//        osw.write(99);

        //        void write(char[] cbuf)	写入一个字符数组
        char[] chs={'a','b','c','d','e'};
//        osw.write(chs);

        //        void write(char[],cbuf,int off,int len)	写入字符数组的一部分
//        osw.write(chs,0,chs.length);
//        osw.write(chs,1,3);

        //        void write(String str)	写一个字符串
//        osw.write("abcde");

        //        void write(String str,int off,int len)	写一个字符串的一部分
//        osw.write("abcde",0,"abcde".length());
        osw.write("abcde",1,3);


        //释放资源
        osw.close();  //关闭流,先刷新,释放完之后不能再写数据
    }
}

 

方法名说明
flush()刷新流,还可以继续写数据
close()关闭流,释放资源,但是在关闭之前会先刷新流,一旦关闭,就不能再写数据

 6.字符流读数据的2种方法

方法名说明
int read()一次读一个字符数据
int read(char[] cbuf)一次读一个字符数组数据
package com.aynu9;


//读取数据两种方法
//        int read()	一次读一个字符数据
//        int read(char[] cbuf)	一次读一个字符数组数据

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        //InputStreamReader (InputStream in):创建一个使用默认字符集的InputStreamReader
        InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\idea1\\workplace\\myMap\\osw.txt"));

        //int read(); 一次读一个字符数据
//        int ch;
//        while ((ch= isr.read())!=-1){
//            System.out.print((char)ch);
//        }

        //int read(char[] cbuf):一次读一个字符数组数据
        char[] chs=new char[1024];
        int len;
        while ((len= isr.read(chs))!=-1){
            System.out.print(new String(chs,0,len));
        }




        //释放资源
        isr.close();

    }
}

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

摄影入门 | 相机的基本原理

一、获取图像——小孔成像实验 小孔成像实验中,点燃蜡烛,会在小孔另一面的白纸上看到一个倒立的烛焰。 此现象可以用来解释物理学原理:光在同种均匀介质中,在不受引力作用干扰的情况下沿直线传播。 这样,我们就用一种…

从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构

目录引言技术选型正文创建基础架构IDEA创建项目添加Netty监听端口编写客户端进行测试总结引言 由于现在java web太卷了,所以各位同行可以考虑换一个赛道,做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识,给新人们一些学习…

伪静态技术

网址和纯静态一样,只是,其内部仍旧需要查询数据库:如果有一个页面,希望这个页面利于seo,但是有不适合使用真静态,比如csdn论坛帖子,可以考虑使用伪静态,即: 形式上是一个静态地址,比…

Chapter7.2:MATLAB在频率法中的应用及频率法稳定性分析

该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…

PyTorch 深度学习实战 | DIEN 模拟兴趣演化的序列网络

01、实例:DIEN 模拟兴趣演化的序列网络深度兴趣演化网络(Deep Interest Evolution Network,DIEN)是阿里巴巴团队在2018年推出的另一力作,比DIN 多了一个Evolution,即演化的概念。在DIEN 模型结构上比DIN 复杂许多,但大家丝毫不用担心,我们将DIEN 拆解开来详细地说明…

Intel 处理器 macOS降级到Big Sur

1 创建可引导的 macOS 安装器 将移动硬盘作安装 Mac 操作系统的启动磁盘。 创建可引导安装器需要满足的条件 移动硬盘(格式化为 Mac OS 扩展格式),至少有 14GB 可用空间已下载 macOS Big Sur的安装器 2 下载 macOS macOS Big Sur安装器会…

【GPT4】微软 GPT-4 测试报告(1)总体介绍

欢迎关注【youcans的AGI学习笔记】原创作品,火热更新中 微软 GPT-4 测试报告(1)总体介绍 微软 GPT-4 测试报告(2)多模态与跨学科能力 微软 GPT-4 测试报告(3)GPT4 的编程能力 【GPT4】微软 GPT-…

Thingsboard使用gateway网关

简介: 本次是想测试一下thingsboard网关的使用,实现通过网关mqttthingsboardemqx 实现间接设备创建和数据传输 前期准备: thingsboard平台 thingsboard网关 emqx平台 MQTTX工具 详细过程: 1:thingsboard平台搭建 …

字节、阿里等大厂年薪50w+的测试都什么水平?

各位做测试的朋友,但凡经历过几次面试,那么你一定曾被问到过以下问题: 1、在Linux环境下,怎么执行web自动化测试? 2、Shell如何,Docker熟悉吗? 3、全链路的压测实操过吗,如何推进与开…

FasterNet实战:使用FasterNet实现图像分类任务(一)

文章目录摘要安装包安装timm安装 grad-cam数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集摘要 论文翻译:https://wanghao.blog.csdn.net/article/details/129485972?spm1001.2014.3001.5502 官方源码: https://github.com/JierunChen/Faste…

VR实景导航,解决最后几十米的导航问题

你是否跟朋友有过这样的经历:“哎,你说的那个餐厅在哪呀?”,“这家商场好复杂,怎么转啊”,“你在医院哪一层?我怎么找不到你呀!”等等。在建筑内部,我们的地图导航并不是…

在U盘上运行的 Windows

版本:5.6.1平台:Win x64语言:简体中文,繁体中文,英文更新时间:2023-03-04 下载地址:https://dl.luobotou.org/wtga5610.zip 解压后运行WTGA文件夹中的wintogo.exe启动程序。从5.5版本开始不再支持32位系统、Win7系统…

HTTP协议加强

HTTP协议加强 Date: January 19, 2023 Sum: HTTP请求、响应、请求方法、响应状态代码 HTTP协议简介 什么是通信 通信,就是信息的传递和交换。 通信三要素:通信的主体、通信的内容、通信的方式 现实生活中的通信 案例:张三要把自己考上传…

美颜SDK技术原理、技术应用、代码分析

随着社交媒体的普及,人们对于自己的外貌越来越重视。为了满足用户对于美颜需求,各大科技公司纷纷推出了美颜SDK技术,使得用户可以在拍照和视频中实现美颜效果。本文将对美颜SDK技术进行详细分析。 一、美颜SDK技术的原理 美颜SDK技术是一种基…

精简指令集结构(Reduced Instruction Set Computer,RISC)

ARM内核采用精简指令集结构(Reduced Instruction Set Computer,RISC)体系结构。RISC技术产生于20世纪70年代,其设计目标是创建一种能以每个时钟周期执行一条指令的速度很快的计算机。RISC的设计重点在于降低由硬件执行的指令复杂度…

Kubeadm生成的k8s证书内容说明以及延长证书过期时间

Kubeadm生成的k8s证书内容说明Kubeadm生成的k8s证书内容说明:证书分组Kubernetes 集群根证书由此根证书签发的证书有:kube-apiserver 代理根证书(客户端证书)etcd 集群根证书etcd server 持有的服务端证书peer 集群中节点互相通信使用的客户端证书pod 中定义 Livene…

函数的定义与使用及七段数码管绘制

函数的定义 函数是一段代码的表示 函数是一段具有特定功能的、可重用的语句组 函数是一种功能的抽象,一般函数表达特定功能 两个作用:降低编程难度 和 代码复用 求一个阶乘 fact就是 函数名 n就是参数 return就是输出部分即返回值 而函数的调用就是…

【计量】回归背后的微操作——论文自救记录(进行中)

【计量】回归背后的微操作 1. 变量的选择 与 模型的设定 https://zhuanlan.zhihu.com/p/50577508?yidian_smb 2. 变量的处理 2.1 常用的处理——中心化、标准化、归一化 目的:统一量纲(Scale)—— 可以理解成 100分制下,1 2分…

Spring Security 6.0系列【2】认证篇之使用数据库存储用户

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录前言1. 环境搭建1.1 创建用户表1.…

Oracle用户密码过期,修改永不过期

修改密码有效过期时间,可以通过以下四步设置,如果再第一步发现本身的密码过期时间为无限期的,那就请各位小伙伴绕过,如果发现不是无期限的,那么必须设置第四步,才会生效。 目录 第一步:查询密码…