字符集
规定了字符和二进制之间对应关系的一张表
字节是计算机最基本的存储单位
字符则是通过字符组成和编码而成的文本
常见字符集
1,ASCII字符集
基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号
一个字节表示一个字符
所有的字符集均兼容ASCII字符集
2,GBK国标码
对ASCII字符集进行了扩展,
汉字使用两个字节来表示一个字符,英文数字占一个字节
,可以表示更多的字符范围,包括汉字和其他的特殊符号共2w多字符,可以满足大部分中文字符的需求.但无法在全球范围使用
3,Unicode全球字符编码标准
包含所有已知字符,包括各种语言的字符符号和图形,可以根据字符的范围使用不同长度的字节,实现高效的存储和传输,
UTF-8编码三个字节表示一个字符,英文数字占一个字节
编码和解码
编码:把字符按照指定字符集编码为字节
解码:把字节按照指定字符集解码为字符
String类中提供了相应方法来实现编码和解码
编码:把字符串按照指定字符集转换为字节数组
解码:把字节数组按照指定的字符集转换为字符串
byte[] b = a.getBytes("字符集")//编码
String a = new String(b,"字符集")//解码
解码编码必须一致否则会乱码
英文和数字一般不会乱码,因为兼容ASCII码
字符流
字符流=字节流+编码表
因为UTF-8编码和GBK编码在设计编码时中文需要占2-3个字节,这导致字节流读取会读取半个汉字的情况,也就出现了乱码
而使用字符流就可以很好的解决这个问题
字符流分为
字符输入流
最顶层抽象类为Reader
可以使用其常用子类FileReader类
字符输出流
最顶层抽象类Writer
可以使用其常用子类FileWriter类
字符输入流
构造器
public FileReader(File file)
//创建字符输入流管道与源文件接通
public FileReader(String pathname)
//创建字符输入流管道与源文件接通
方法
public int read()
//每次读取一个字符返回,如果发现没有数据会返回-1
public int read(char[] buffer)
//使用字符数组读取,返回读取了多少个字符,没有数据返回-1
字符输出流
构造器
public FileWriter(File file)
//创建字节输出流管道与源文件对象接通
public FileWriter(String filepath)
//创建字节输出流管道与源文件路径接通
public FileWriter(File file,boolean append)
//创建管道连接文件,可以追加数据
public FileWriter(String filepath,boolean append)
//创建管道连接文件,可以追加数据
方法
void write(int c)//写一个字符
void write(String str)//写一个字符串
void write(String str,int off,int len)//写字符串的一部分
void write(char[] ch)//写一个字符数组
void write(char[] ch,int off,int len)//写字符数组的一部分
void flush()//刷新流,把内存中的数据刷新到硬盘中
void close()//关流,自动刷新一次,关流之后对象无法再次使用
缓冲流
对原始流包装,提高了原始流读写数据的性能
原理:缓冲输入/输出流自带了8KB的缓冲池(底层封装了一个8kb的字符数组)
缓冲流的工作原理是先将数据写入内存缓冲区,当缓冲区满时再将数据一次性写入到磁盘或者网络中,这样可以减少实际的读写次数,提高读写效率.
缓冲流的优点
减少IO操作次数
提高读写效率
处理大量数据时,显著提升程序性能
flush()方法
1,
文件以字节形式存在,所以字节流不需要在内存中进行转换,可以直接进入文件,由于字节流不自带缓冲区,使用缓冲流提升巨大,且字节流的flush()方法没有实现(没有方法体).
2,
字符流需要在内存中进行转换,所以需要flush方法手动将数据刷入硬盘,字符流自带缓冲区,所以使不使用缓冲流差距不大
3,
缓冲流在底层创建一个8kb的数组,当数组装满时存入硬盘,减少内存和硬盘的交互,提高效率
IO流体系
字节流包装构造
public BufferedInputStream(InputStream is)
//把低级字节输入流包装为一个高级缓冲字节输入流,提高读取性能
public BufferedOutputStream(OutputStream os)
//把低级字节输出流包装为高级缓冲字节输出流,提高写入性能
字符流包装构造
public BufferedReader(Reader r)
//把低级的字符输入流包装为字符缓冲输入流,提高读取性能
特有方法:
public String readLine()
//读取一行数据返回(不包含换行符),如果没有数据可读,会返回null
public BufferedWriter(Writer r)
//把低级的字符输出流包装成一个高级的缓冲字符输出流,提高写入性能
特有方法:
public void newLine()
//根据系统写出换行符
转换流
JAVA IO库中的一种特殊流,
在需要把字节流转成字符流时使用
例如网络编程中发送字节数据需要发送中文时,需要使用转换流转成字符流
用于将字节流转换为字符流
提供了两个类:
InputStreamReader和OutputStreamWriter
转换流的本质属于字符流,所以可以使用字符流中所有的功能
转换流的主要用途是在字节流和字符流之间进行转换,使得在处理文本或者字符数据时更加方便,可以解决使用字节流读取中文出现乱码的问题
输入流转换构造器
InputStreamReader(InputStream in)
//创建一个使用默认字符集的InputStreamReader对象,将给定的字节输入流转为字符流
InputStreamReader(InputStream in,String charsetName)
//创建一个使用指定字符集charsetName的InputStreamReader对象,
//将给定的字节输入流转为字符流
//把原始的字节输入流,按照指定字符集编码成字符输入流
输出流转换构造器
OutputStreamWriter(OutputStream in)
//创建一个使用默认字符集的OutputStreamWriter对象,将给定的字节输出流转为字符流
OutputStreamWriter(OutputStream in,String charsetName)
//创建一个使用指定字符集charsetName的OutputStreamWriter对象,
//将给定的字节输出流转为字符流
序列化流操作
将对象转换为字节流,以便于在网络上传输或者保存到文件
将对象的状态保存,以便于在需要时重新生成
ObjectOutputStream类
将对象序列化为字节流
构造方法创建对象
ObjectOutputStream(OutputStream out)
//将序列化的数据写入给定的输出流out
写出对象
public void writeObject(Object obj)
//将给定的对象obj序列化写入输出流
ObjectInputStream类
将字节流反序列化为对象
构造方法创建对象
ObjectInputStream(InputStream out)
//从给定的输入流in中读取反序列化的数据
读入对象
当读到文件末尾继续读时,会返回EOF异常,需要用trycatch捕获
public Object readObject()
//从输入流中读取字节并反序列化为对象
注:
1,写入对象必须实现Serializable接口
Serializable接口是一个标记接口,没有任何方法需要实现,只是告诉虚拟机,该类对象可以被序列化,如果没有实现该接口,会抛出NotSerializableException异常
2,transient是一个关键字,用于修饰变量.
当一个变量被transient修饰时,将不会被序列化,即在对象被写入文件或通过网络传输时,该变量的值不会被保存或传输
3,在对象序列化为文件后,在反序列化前修改类会异常
在序列化对象时,会根据此类生成一个序列化号,序列化号根据此类的信息自动生成.
更改类中信息时,会重新生成序列化号
导致InvalidClassException异常,因为类的版本与序列化时的版本一致
解决方案:
固定serialVersionUID::使⽤private static final long serialVersionUID
显式地声明⼀个恒定的serialVersionUID
,确保在类的结构发⽣变化时,
serialVersionUID
的值保持不变。这样可以确保序列化和反序列化过程中的版本⼀致性。
eg:
private static final long serialVersionUID
= 123456789;
序列化的使用
将对象提前存在容器中,需要序列化时直接序列化容器对象即可
存入时存入一次容器
读取时也只需读取一次,避免循环判断
IO框架 commons-io
一个Apache开源项目,属于第三方工具包.
提供了一组常用的I/O相关的工具类,用于简化java代码,与官方核心类库无关
常用功能
1,文件操作:复制删除移动等
2,文件过滤:根据文件名和文件后缀对文件过滤
3,字符集操作:将字节数组转成字符串等
使用
下载并导入jar包
创建libs文件夹
复制jar包到文件夹中
在jar包上单击添加为"Add as Library"
官⽅API⽂档地址 : https://commons.apache.org/proper/commons-io/javadocs/api-release/