Java IO流

IO流类结构图

在这里插入图片描述

IO流的分类

  1. 按数据流向:输入流和输出流
    输入和输出都是从程序的角度来说的
    输入流:数据流向程序
    输出流:数据从程序中流出

从磁盘、网络、键盘读到内存,就是输入流。用InputStream或Reader
写到磁盘、网络、显示器,就是输出流。用OutputStream或Writer

  1. 按处理单位:字节流和字符流
    字节流:一次读入或读出是8位二进制
    字符流:一次读入或读出是16位二进制
    JDK中后缀是Stream是字节流,后缀是Reader/Writer是字符流
    区别:

    • 字节流操作的基本单位是字节,字符流操作的基本单位是字符
    • 字节流默认不使用缓冲区,字符流使用缓冲区
    • 字节流通常用于处理二进制数据,不支持直接读写字符,字符流通常用于处理文本数据
    • 在读写文件需要对文本内容进行处理,按行处理,比较特定字符的时候一般会选择字符流,仅仅读写文件,不处理内容,一般选择字节流
  2. 按功能:节点流和处理流
    节点流:直接与数据源相连,读入或写出
    处理流:与节点流一起使用,在节点流的基础上再套接一层。是对已存在的流的连接和封装,实现更为丰富的流数据处理,处理流的构造方法必须有其他的流对象的参数。
    在这里插入图片描述

转换流

  1. InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)
  2. outputStreamReader:Writer的子类,可以将OutputStream(字节流)包装成Writer(字符流)
  3. 转换流的应用场景:当处理纯文本数据时,如果字符流的效率更高,并且可以有效解决中文因编码问题导致的乱码时,建议将字符流转换为字符流
//创建InputStreamReader对象
InputStreamReader is = new InputStreamReader(new FileInputStream("src\\a.txt"), "utf-8");
//包装为BufferedReader
BufferedReader reader = new BufferedReader(is);
//读取
String line = reader.readLine();
reader.close();

缓冲流

在内存与硬盘之间创建一个大小合适的缓冲区,当内存和硬盘进行数据访问时,能提高访问硬盘的次数,提高效率。
是一个包装流,目的起缓冲作用.包括:
BufferedInputStream:字节输入缓冲流
BufferedOutputStream:字节输出缓冲流
BufferedReader:字符输入缓冲流
BufferedWriter::字符输出缓冲流

缓冲流的优缺点:

  1. 不带缓冲的流读取到一个字节或字符,就直接写出数据
  2. 带缓冲的流读取到一个字节或字符,先不输出,等达到了缓冲区的最大容量,再一次性写出
  3. 优点:减少了写出次数,提高了效率
  4. 缺点:接收端可能无法及时获取到数据
//创建缓冲流对象,套接在指定的节点流基础上
//注意Reader、Writer是按字符读取的,因此不能操作二进制文件,如图片、音乐,否则读取数据错误
BufferedReader br = new BufferedReader(new FileReader("d:\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\c.txt"));
//边读边写
String line;
while((line = br.readLine()) != null){
		bw.wwrite(line);
		bw.newLine();
}

bw.close();
br.close();

对象流

使用ObjectOutputStream序列化基本类型和一个Dog类型,并保存到data.dat中

//创建流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\data.src"));
//写入对象(序列化)
//在保存100时,以Integer进行装箱,Integer实现了Serializable
oos.writeInt(100);
//Charater实现了Serializable
oos.writeChar('a');
//String实现了Serializable
oos.writeUTF("张三丰");
//Dog实现了Serializable
//序列化对象时,默认将里面所有属性都进行序列化,但除了static和transient修饰的成员
oos.writerObject(new Dog("修狗",10));

oos.close();

注意:将文件中的内容通过ObjectInputStream 反序列化恢复Dog对象时,若Dog类的属性改变,会报InvalidClassException,因为这时JDK会认为这是一个新的类,因此建议在序列化的类中添加SerialVersionUID,以提高版本的兼容性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值