b java I/O 类源码分析

—> go to 总目录

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

博客
仅仅让类实现了装饰器,
在这里插入图片描述
有一堆子类。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章