IO回顾和梳理

File类

跨平台的表示文件或者路径

创建File实例时通过文件路径字符串(相对路径的解释依据运行jvm的位置而定 由系统属性user.dir指定)字符串可以指向路径或者一个文件 但实际上可以不存在(可以进行查询是否存在以及进行创建)

创建了File实例后可以通过api进行对文件或者路径的增删改查操作 比如对于文件名字的操作 检测文件是否存在、获取文件常规信息、文件操作的方法,对于路径也有创建文件夹以及查询操作。

File类的list()方法通过一个函数式接口可以递归遍历其下所有的子目录和文件
在这里插入图片描述
在这里插入图片描述

IO流

java.io包下流的分类:

  • 按照流向

    • 输入流InputStream Reader
    • 输出流OnputStream Writer
  • 按照单位

    • 字符流 Reader Writer
    • 字节流 InputStream OutputStream
  • 按照处理对象 (装饰器模式)

    • 节点流(低级流) 与IO设备读写
    • 处理流(高级流、包装流) 对其他流进行连接或封装

InputStream 、Reader、OnputStream和 Writer是IO流的四个抽象基类 Stream和Reader的不同只在于流的最小单位

输入流 Reader 和 InputStream

输入流 Reader 和 InputStream 具有三个类似的read方法
在这里插入图片描述
差距就是每次读取是读取单个字符或者使用数组去读 当read方法返回-1时代表输入流结束 这里的read是从现成的Reader InputStream流里去读数据
注意Reader 和 InputStream 作为抽象类无法创建实例 各自有一个子类FileInputStea
m和FileReader 都是上边所说的节点流 直接与File指定的文件关联
FileInputStream fis = new FileInputStream("xxx.java");
字符串指定某个文件将其使用FileInputStream获取到输入流


一般的read使用方法 使用while循环一般的read使用方法 使用while循环

程序里打开的IO资源和JDBC连接不属于内存中的资源,GC回收不了 需要显式关闭
java7IO资源类都实现AutoCloseable接口 其中void close() 在定义IO对象时写在try块中会被自动调用关闭

这里读取了字节后转换为String字符串 不同的字符集每个字符使用的字节数不同 如果字节流去读取文件时读取了一半可能乱码 bbuf的大小小于流大小 就需要读多次 这样就可能会产生乱码

在这里插入图片描述

OutputStream和Writer

在这里插入图片描述
FileWriter和FileOutputStream
在这里插入图片描述

关闭输出流可以同时自动指向flush()方法 将输入流缓冲区中的数据flush到物理节点里 很多输出流都具有缓冲功能

在这里插入图片描述
当前文件下输出txt文件
不同平台的换行符不同 win /r/n unix /n

使用处理流

使用处理流包装了节点流后 进行输入输出的操作更简单,执行效率也会提升
在这里插入图片描述
System.Out的类型即为PrintStream
创建处理流时将节点流作为参数即可 关闭了处理流即可关闭下层节点流

IO体系在这里插入图片描述

在这里插入图片描述
其中根据按功能分开后 有根据输入输出字符字节而划分了这些类
输入输出内容 字符或是字节使用字符流或字节流

在这里插入图片描述

其中有以数组或者字符串作为物理节点的流
访问管道的流(进程之间通信)
增加了缓冲功能的流
进行序列化的对象流
转换流
将字节流转换为字符流 (字节流适用范围更大,字符流更方便)
InputStreamReader OutputStreamWriter
在这里插入图片描述
System.in代表标准输入即键盘输入 但此输入是InputStream的实例 使用不便 使用InputStreamReader 将其转换为Reader 普通的Reader仍旧使用不便 通过转换为处理流BufferedReader 利用其readLine()方法可以一次读取一行

BufferReader流具有缓冲功能,一次读一行以换行符为标志没读到就阻塞 的readLine()方法一次读取一行

推回输入流

重定向标准输入输入

JVM读取其他进程的数据

RandomAccessFile

随机(任意)读写文件 但不能读写节点
通过记录指针的操作实现对文件内容的随意访问和指向

序列化

磁盘存储或者网络传输时进行序列化和反序列化(二进制流和对象的转换)

https://www.cnblogs.com/zhengshao/p/8882613.html

要进行序列化必须使得类可以序列化 实现Serialize或者Externalized
使用RMI时需要

对象引用的序列化

反序列化机制不会使用到构造器

如果没有明确指定serialVersionUID,序列化的时候会根据字段和特定的算法生成一个serialVersionUID,当属性有变化时这个id发生了变化,所以反序列化的时候会异常

NIO

之前的IO流输入输出都是阻塞式的 (BufferReader和其他的输入输出流)而且无论字符流字节流其底层实现都是依赖于字节处理 一次处理一个字节 效率太低
NIO有Buffer和Channel两个核心对象

使用内存映射文件的方式处理输入输出 新IO将文件或者文件的一段区域映射到内存中。然后就可以 (模拟OS中的虚拟内存)

Buffer

Buffer是个容器 类似数组
作为抽象类 其实现有各种基本数据类型的相应Buffer类 最常用的是ByteBuffer;
这些Buffer类除了操作的数据类型其他操作大同小异 都没有提供构造器使用static XxxBufer allocate(int capacity)返回对象[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6PayYB7J-1623118319822)(IO2021.assets/1623074595940.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JP6SlZ36-1623118319823)(IO2021.assets/1623074750464.png
)]

过程概述:
		position为0 limit指向capacity
当使用put()方法向Buffer中写数据或者从Channel中读入数据时 每放入一些数据 position向后移动 

当写完后准备输出 使用flip()方法做好输出准备 此时limit指向position位置(后边没写的区域不可见) position指向0 开始向外输出

Buffer输出数据结束后使用clear()方法 不过它不会清除Buffer里的数据而是使得postion指向0 limit指向capacity

img-iINzYB72-1623118319824)(IO2021.assets/1623075319746.png

代码分析
当clear后不会进行清除 所以之前的没被取出的还能被访问到 

DirectBuffer 直接内存的使用 通过ByteBuffer.allocateDirect()创建堆外内存

img-q1upb5k9-1623118319827)(IO2021.assets/1623075744088.png

编程级别上使用没有区别

Channel

IO2021.assets/1623077051169.png
IO2021.assets/1623115935936.png
IO2021.assets/1623115956633.png
IO2021.assets/1623116221574.png

IO2021.assets/1623116236392.png
IO2021.assets/1623116249808.png

IO2021.assets/1623116575378.png

IO2021.assets/1623116670324.png

IO2021.assets/1623116682227.png

CharSet

使用CharSet类对字符序列和字节序列使用指定字符集进行编码解码

FileLock

文件加锁IO2021.assets/1623117115625.png

IO2021.assets/1623117097422.png

1623117138572.png

IO2021.assets/1623117165291.png

NIO.2

java7对NIO的升级

  • 1.全新文件IO和文件系统访问

IO2021.assets/1623117296437.png

IO2021.assets/1623117470446.png
)]

IO2021.assets/1623117482252.png
​ 结合java8StreamApi

  • 2.FileVisitor遍历文件和目录
  • 3.WatchService监控文件变化
  • 4.访问文件属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值