b java I/O 类源码分析
文章目录
- 一、目录
- 1.1 I/O Streams
- Byte Streams 处理raw数据
- Character Streams 自动转化成本地字符集,字符对象的处理
- Buffered Streams 带缓存以减少native方法
- Scanning and Formatting 允许从不同格式文件读取
- I/O from the Command Line 从标准输入和控制台对象读入
- Data Streams 从私有的Data对象(比如zip等)和String值
- Object Streams 从对象中读写
- 1.2 File I/O (Featuring NIO.2)
- 二、I/O Streams
- 2.2 模型接口
- 2.3 功能接口
- 2.4 上层读写接口
- 2.5 详细模型接口
- 三、FileIO NIO 2.0
- 4. 使用接口
java 处理读写的包,分布在IO和NIO包里面。
一、目录
java官方教程的目录,可以看出IO包的设计和结构
来源于JDK文档
1.1 I/O Streams
Byte Streams 处理raw数据
Character Streams 自动转化成本地字符集,字符对象的处理
Buffered Streams 带缓存以减少native方法
Scanning and Formatting 允许从不同格式文件读取
I/O from the Command Line 从标准输入和控制台对象读入
Data Streams 从私有的Data对象(比如zip等)和String值
Object Streams 从对象中读写
1.2 File I/O (Featuring NIO.2)
path的概念
java.nio包中的基石 Path Class
path的操作
file的操作
设置文件属性
随机读写
遍历文件树
寻找文件
监控一个文件的改变
典型的File IO 代码
二、I/O Streams
东西太多很难保证清晰不过可以分层
-
模型接口
Bits、 FileSystem、 FileDescripter等,为数据和文件系统提供模型 -
功能接口
Closeable、FlushAble、Serilalizable,数据的关闭刷新和序列化 -
上层读写接口
InputStream和OutputStream、Reader和Writer,console代表控制台 -
细分读写接口
结合目录谈到的分类的,细致分工
2.2 模型接口
2.2.1 Bits
- 字节工具类方法,为byte arrays提供模型对象。
- 二进制转基础类别
比如把byte(8 bit)转化为Int (4 byte)
2.2.2 FileDersecriptor
文件描述符。首先文件描述符是一个很通用的概念fd
。这里是fd的java模型。
- int fd : in-0 处理输入;out-1 输出;err-2 异常;-1 非法文件;
- closeAll:功能是关闭所有相关的fd。因为存在这一种情况,inptutStream或者OutPutStream新建时时层层新建的。存在父子关系,这个类用数组来保存父引用。底层关闭时就可以层层向上关闭。
closeable的实现就是一堆Stream或者Reader/Writer
2.2.3 FilePermission
文件权限,就是linux的文件权限字符。提供文件权限的描述和工具
- EXECUTE = 0x1;
- WRITE = 0x2;
- READ = 0x4;
- DELETE = 0x8;
- READLINK = 0x10;
2.2.4 FileSystem
文件系统,对文件的解析,操作。不同操作系统对文件的访问方式都不同,主要体现在权限,分隔符,盘符等。
2.2.5 buffer模型
这个是nio的东西但是也很重要,提出来单讲。
-
mark: mark = position;
-
reset: position = mark ;读写位置记为标记位
-
clear ;清零
-
flip ;重读操作
一般用于数据的转运。比如 -
rewind; position=0重头开始读
-
remain: limit - position 还剩多少字符
2.3 功能接口
2.3.1 Closeable
提供close()
的方法接口。所有实现该接口的方法,都可以被close()。
2.3.2 Flushable
- flush 方法
将所有缓存的数据,发送给对端的Stream。
2.3.3 Serializable
提供序列化的能力,被序列化的类必须具有一个UUID。
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
2.4 上层读写接口
2.4.1 console
最特殊的读写,从控制台读写。新建时和具备console的设备绑定,一般是通过jvm绑定。
- 基于charater字符读写
2.4.2 InputStream
- 单字节读取
- 读取到数组
- 支持不支持mark–标记当前位置
核心就这一个模型
- 0到EOF结尾,读取到数组的时候,这是一个基础模型
2.4.3 OutputStream
和 inputStream相反。一般写到对面流有两步
- write
- flush–真正的刷新到对面的流
2.4.4 Reader
基于char的来读写,功能和inputStream类似。
但是所有的读写都是基于charbuffer,理解了这个数据结构就是理解了,reader
charbuffer 提供对char的操作集合
但是这个仅仅是一个抽象类,依赖不同字符集的具体实现
数据模型
2.4.5 Writer
同Reader和OutputStream,多了append函数
2.5 详细模型接口
会详细介绍第一个,后面的实现类都雷同。
InputStream
-
FileInputStream
以文件为入口参数,读写file -
ByteArrayInputStream
也是类似的buffer模型,内置一个数组去读写 -
PipedintputStream
-
管道的概念,首先管道是用于线程间通信的
-
管道是一对的,有个connect概念。
-
PipedInputStream内置buffer数组进行信息交换时的存储
-
PipedOutputStream保留一个应用
sink
。这样就实现了线程间通信的工能。 -
SequenceInputStream
不行前面几个,始终针对一个stream,它保留有一个列表。读取的时候可以批量的读取 -
FilterInputStream
很精简的一个类,可以保留一个传入的in,基于这个传入inputStream进行操作,而不是像其他的直接新建。 -
BufferedInputStream
继承FilterInputStream类,内置buffer,读写从buffer中进行,不直接和steam交+ pushbackInputStream
继承FilterInputStream类,内置一个unread方法:position=position-len
。实现读后指针复位,相当于没读。 -
DataInputStream
内置了类型的转化
OutputStream、Reader、Writer
类似,不过Reader和Writer都是基于字符集的读写。
三、FileIO NIO 2.0
NIO包是一个完整的network包,其中对文件的操作很方便,被广泛使用。
定义在NIO的File目录下,
3.1 Path的概念
软连接
单纯的引用,相当于快捷方式硬链接
相当于副本,但是和源文件会同步更新
3.2 文件模型
File
在I/O包中。提供简单的文件操作。是文件的抽象模型
Path
在NIO包中,对路径概念的抽象模型。都是
Paths
Path的静态方法工具类。但是定义很少,看来没用。
Files
文件的操作的工具类
- 文件的增删复制
- 文件的读写、属性修改
- channel 双工读写通道
文件操作类型,调用write等函数时,默认的行为
枚举 | |
---|---|
WRITE | 文件写 |
APPEND | 追加读写 |
TRUNCATE_EXISTING | 创建新文件文件设为0size |
CREATE_NEW | 创建文件,如果文件存在就抛出异常 |
CREATE | 文件存在就不创建,不存在就创建 |
DELETE_ON_CLOSE | close就删除用于临时文件 |
SPARSE | – Hints that a newly created file will be sparse. This advanced option is honored on some file systems, such as NTFS, where large files with data “gaps” can be stored in a more efficient manner where those empty gaps do not consume disk space. |
SYNC | 同步读写 |
DSYNC | 异步读写 |
3.3 随机读写
其实不是随机读取到意思,是直接读取指定位置的意思。
3.4 遍历文件
FileVisitor
文件钩子,意思就是打开或者关闭文件会触发。
- preVisitDirectory 目录被查看之前触发
- postVisitDirectory 目录被查看之后触发
- visitFile 文件被查看之后
- visitFileFailed 文件读取失败后触发
3.5 find文件
3.6 监视文件事件
4. 使用接口
FilterInputStream
博客
仅仅让类实现了装饰器,
有一堆子类。