流的概念图:
一、流的分类:
1.操作数据单位:字节流、字符流
2.数据的流向:输入流、输出流
3.流的角色:字节流、处理流
二、流的体系结构
抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream BufferedOutputStream
Reader FileReader BufferedReader
Writer FileWriter BufferedWriter
说明点:
1.read()的理解: 返回读入的一个字符. 如果达到文件末尾, 返回-1
2.异常的处理: 为了保证流资源一定可以执行关闭操作.需要使用try-catch-finally处理
3.读入的文件一定要存在,否则就会报FileNotFoundException
从内存中 写出数据到硬盘的文件中
说明:
1.输出操作, 对应的File可以不存在. 并不会报异常
File对应的硬盘中的文件如果不存在, 在输出的过程中, 会自动创建此文件
File对应的硬盘中的文件如果存在:
如果流使用的构造器是FileWriter(file,false) / FileWwriter(file): 对原有的文件的覆盖
如果流使用的构造器是FileWriter(file,true) : 不会对原有文件覆盖, 而是在原有文件基础上追加
缓冲流的使用:
1.缓冲流
BufferedInputStream
BufferedOutStream
BufferedReader
BufferedWriter
2.作用:提供流的读取、写入的速度
提高读写速度和原因: 内部提供了一个缓冲区
3.资源关闭
要求:先关闭外层的留, 在关闭内层的流
说明: 关闭外层流(缓冲流)的同时, 内层流也会自动的进行关闭. 关于内存流的关闭, 我们可以省略
实现图片的加密:
1.转换流:属于字符流
InputStreamReader: 将一个字节的输入流转换为字符的输入流
OutputStreamWriter:将一个字符的输出流转换为字节的输出流
2.作用:提供字节流与字符流之间的转换
3.解码:字节、字节数组 → 字符数组、字符串
编码:字符数组、字符串 → 字节、字节数组
2.对象流:
ObjectInputStream 和 ObjectOutputStream
作用:
ObjectOutputStream: 内存中的对象 → 存储中的文件、通过网络传输出去
ObjectInputStream: 存储中的文件、通过网络传输出去 → 内存中的对象
3.随机存取文件流
1.RandomAccessFile直接继承于java.lang.Object类, 实现了DataInput和DataOutput接口
2.RandomAccessFile既可以作为一个输入流, 有可以作为一个输出流
3.如果RandomAccessFile作为输出流时, 写出到的文件如果不存在, 则在执行过程中自动创建.
如果写出到的文件存在, 则会对原文件内容进行覆盖.(默认情况下, 从头覆盖)
4.可以通过相关操作, 实现RandomAccessFile"插入"数据的效果