[JavaSE进阶笔记]day12 字符流

目录

字符流

编码表

JAVA编码

JAVA解码

字符流类

FileReader

FileWriter

转换流

BufferedReader

BufferedWriter

打印流

PrintStream

printWriter

对象序列化流

Commons IO


字符流

        汉字:GBK编码占用2字节 UTF-8占用3字节,且第一个字节必定为负数,第一个字节为负数表示这里为汉字,这就是为什么字节流也可以进行汉字的识别

        因为字节流编码每次读取一个字节,所以汉字使用字节流时无法识别,因此使用字符流

        字符流=字节流+编码表

编码表

        按照某种规则,将字符存储到计算机中,称为编码,将计算机中的二进制数按规则解析出来,称为解码。按A编码存储,则必须按A编码解析,否则会导致乱码。这种对应关系规则称为编码表

        字符编码:一套自然语言的编码与二进制数之间的对应关系

        字符集:表示一个系统支持的所有字符的集合,包括个国家文字,标点符号,图形符号,数字等。计算机想要存储和识别个字符集合,就必须要进行字符编码,一套字符集必定包括至少一套字符编码。常见字符集有ASCII字符集,GBXXX字符集,Unicode字符集

        ASCII字符集:美国信息交换标准代码,用于显示现代英文,包括控制字符(转义字符)和可显示字符(英文,数字,西文符号)。7位表示一个字符,共127字符,其扩展集8位表示一个字符,共255个

        GBXXX字符集:GB2312:两个小于127的字符连接在一起表示一个汉字,还包括了日本假名,罗马希腊字母等,而ASCII码中本来的数字,标点,字母也以两个字节编入,就称为全角,原来的127以下的字符称为半角。GBK(ANSI):最常用的中文码表,在GB2312基础上的扩展,同时兼容繁体汉字以及日韩汉字。GB18030:最新的中文码表,采用多字节编码,一个汉字由1,2或4个字节组成,支持了少数民族的文字

        Unicode字符集:为表达任意语言的任意字符而设计,为业界的统一标准,也称为统一码或万国码。用4个字节表达字母,数字或文字。有三种方案:UTF-8,UTF-16,UTF32(相当于Unicode实现类),其中UTF-8最常用

        UTF-8:电子邮件,网页等中优先采用的编码。编码规则:128个ASCII码用一个字节表示,拉丁文用两个字节编码,大部分常用字(含汉字)三个字节编码,其他极少使用的辅助字符四个字节编码。

JAVA编码

        String中getBytes()方法:无参,返回byte[]数组,使用默认字符集将字符串编码

        带一个字符串参数,返回byte[]数组,表示按参数的编码格式进行编码

JAVA解码

        String的构造方法,参数为byte[],按默认字符集对传入的参数解码,构造新的字符串

        参数为byte[]和字符串,按参数的编码格式对传入的参数解码,构造新的字符串

字符流类

        解决字节流读取包括汉字的文本时乱码的问题,字符流按字符(char类型)为单位进行读取

        基类:Reader:字符输入流抽象类 Writer:字符输出流的抽象类

        子类:InputStreamReader和OutputStreamWriter

FileReader

        底层为FileInputSteam+平台默认编码。自带缓冲区

        InputStreamReader的子类,名字简单,不容易写错,一般使用这个读

        构造方法:参数为文件路径名,或File对象

        read参数为char数组类型或无参(返回为int)

FileWriter

        底层为FileOutputSteam+平台默认编码。自带缓冲区

        OutputStreamWriter的子类,名字简单,不容易写错,一般使用这个写

        构造方法:参数为文件路径名,或File对象,可以加个boolean,表示是否为追加写入

        这两种方法不指定字符流的编码解码问题

        write有五个重载:参数为char数组类型或参数为int或char数组的一部分或字符串或字符串的一部分

        flush()方法,无参数,无返回值,刷新流,用于刷新输入的信息,将字符流的缓冲数据写入目标文件。因为字符流相比于字节流有缓冲(默认为8192长度),不刷新无法写入文档。可以继续调用write写入内容

        close()方法,在关闭字符流之前会进行一次刷新,关流后无法继续写入内容

        FileReader和FileWriter不能指定编码格式,只能是平台默认编码,如果想要读取其他编码格式的文件或者编写其他格式的文件,使用转换流

转换流

        InputStreamReader

        字节流到字符流的桥梁,读取字节,并按指定的charset解码为字符。字符集可以由名称指定,可以被明确指定,也可以为默认字符集

        构造方法:参数为输入字节流对象,可以带一个字符串用来指定编码格式

        和字节流读数据成员方法相同

        read参数为char数组类型或无参(返回为int)

        只用关转换流,关联流会自动关闭

        OutputStreamWriter

        字符流到字节流的桥梁,将写入的字符编码为字节。字符集可以由名称指定,可以被明确指定,也可以为默认字符集

        构造方法:参数为输出字节流对象,可以带一个字符串用来指定编码格式

        write()五个重载方法:int写入一个字符,char[]写入字符数组,char[],int off,int len写入数组一部分,String写入字符串,String,int off,int len写入字符串一部分

        flush()方法,无参数,无返回值,刷新流,用于刷新输入的信息。因为字符流相比于字节流有缓冲,不刷新无法写入文档

        close()方法,在关闭字符流之前会进行一次刷新

        字符缓冲流,相当于多级缓存

BufferedReader

        构造方法:参数为字符输入流对象(FileReader),重载指定缓存区大小

        readLine(),无参数,返回String类型,读取一行文字,不包含任何终止字符(如换行符),可以采用println方法手动打印换行,到达结尾时,为null

BufferedWriter

        构造方法:参数为字符输出流对象(FileWriter),重载指定缓存区大小

        newLine(),无参数,无返回值,写入一行行分隔符,由系统属性定义(windows为\r\n),便于适应不同的操作系统

        缓冲流不能调用flush,只需要关缓冲流对象

        标准输入输出流

        System的in静态成员变量,InputStream类型,该流打开准备输入数据,用于键盘输入或主机环境或用户指定的另一个输入源

        是字节流对象,想要转换为字符流,用转换流:InputStreamReader,之后再用字符流创建字符缓冲流进行操作,最好转化为Buffered字符缓冲流,但这样键盘输入太麻烦,Java就有了Scanner类

        out静态成员变量,OutputStream类型,该流打开用于输出数据,用于显示输出或由主机环境或用户指定的另一个输出目标

        为PrintStream字节输出流的对象,可以方便的打印各种数据,System.out.print不能不带参使用

打印流

        字节打印流:PrintStream 字符打印流:printWrite

        实际上为字节/字符输出流,用来写数据

PrintStream

        构造方法:参数File类型或String类型,表示写入数据的文件的路径

        成员方法:除了write方法外,还有独特的print的方法,特有的print方法写什么打印什么,write会转换为字符(转码)

printWriter

        继承writer,包装设计模式,8个构造

        构造方法:参数为字符串表示路径,可以再带一个String指定编码表,不会自动刷新。

        参数为Writer和boolean,如果传入真,则在println,printf和format方法会自动刷新输出缓冲区

        成员方法:print(),println()参数什么输出什么,原样输出

        write()不能原样输出,数字转化为字符

对象序列化流

        将对象保存到磁盘中,或者在网络中传输对象

        用一个字节序列表示一个对象,包括对象的类型,对象的数据和对象中的属性等信息,相当于文件中持久保存了一个对象的信息,如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象

        反之,可以将该字节序列读取出来,重构对象,进行反序列化

        对象序列化流:ObjectOutPutStream继承自OutPutStream(把对象写到文件)

        构造方法:参数为字节输出流的对象

        成员方法:writeObject()参数为Object类对象,即所有指定的对象,无返回值,用于将对象写入对象序列化流

        想要实现对象的序列化和反序列化,必须要将对象的类实现Serializable这个接口,这个接口只是标识接口,没有方法需要重写

        对象反序列化流:ObjectInPutStream继承自InputStream,用于将序列化的对象反序列化(把对象读入内存)

        成员方法:readObject(),无参数,返回Object类,即对象,从目标文件中读取一个对象,读取出来之后可以对Object类进行向下转型,转为想要的类型

        如果想要读取多个对象,使用avaliable方法判断是否还有字节

        在对象序列化之后,改变了对象的类文件,再进行反序列化会抛出异常,原因时串行版本和从流中读取的类描述不符。

        序列化时会与每个可序列化的类关联一个版本号(存入.class文件中),称为serialVersionUID,如果反序列化时UID不同,就会抛出异常

        解决方案:显示声明seialVersionUID,在类的开始部分写(任意访问修饰符,建议private) static final long seialVersionUID=42L,42L可以修改

        如果类的某些成员变量不想被发现,可以在变量类型之前加上transient关键字(瞬态)修饰或者使用static(静态)修饰,使得这个成员变量不参与序列化过程(提取出来为默认初始化值)

Commons IO

        第三方jar包,jar包本质上就是压缩包,可以被idea直接识别。第一方:java官方(Oracle)第二方:我们自身 第三方:jar包的提供者。

        Commons IO由apache基金组织提供,免费开源,该组织还提供了Commons-DBUtils(用于JDBC的简化),tomcat(Web服务器软件),hadoop(大数据),commons-beanUtils(简化数据封装)

        导包步骤:1.在idea的模块下创建lib文件夹 2.将jar包复制到lib文件夹中 3.右键jar包添加为Libray,Level选择jar包的使用范围(一般为模块下)

        我们主要使用FileUtiles和 IOUtils类中的方法

        IOUtils类

        copy()参数为InputStream和OutputStream对象,无返回值,将InputStream关联项目复制到OutPutStream关联的文件

        closeQuietly()参数为流对象,无返回值,每次只能关闭一个流

        FileUtiles类

        copyDirectoryToDirectory()参数为File和File,无返回值,将源文件夹复制到目标文件夹

        writeStringToFile()参数为File和和String,无返回值,将字符串写入目标文件

        readFileToString(),参数为File,返回String,将目标文件读入字符串后返回

        deleteDirectory()参数为File,无返回值,删除文件夹

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值