当前位置: 首页 > article >正文

文件:IO流

1. 什么是IO

  •  /O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;
  • java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一个“类”,都放在http://java.io这个包里面。

2. 如何理解这个 '流'

通过“流”的形式允许java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收的(sink)的有序数据。我们这里把输入/输出源对比成“水桶”,那么流就是“管道”,这个“管道”的粗细、单向性等属性也就是区分了不同“流”的特性。

 3.  认识文件

1.什么是文件

针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,这就叫做文件

文件管理 采用的是树形结构,是N叉树,至于目录,其实就是文件夹

2. 文件路径

路径分为绝对路径和相对路径:

绝对路径:从树的根部开始查找

相对路径:从树的某一个节点为基准进行查找

文件分为文本文件和二进制文件:

文本文件就是放在记事本上能看懂的,比如.txt文件

二进制文件就是放在记事本上看不懂的,比如.docx,.jpg,.image等

4. 文件操作类

Java标准库为我们提供了 File 这个类;

File 对象是文件操作的一个抽象表示:文件是存储在硬盘上的,不太方便。直接在内存中创建一个对应的对象,操作到这个内存对象,就可以间接的影响到硬盘的文件情况了。

File 类的属性:

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示
static charpathSeparator依赖于系统的路径分隔符,char 类型的表示

File 类的构造方法:

签名说明
File(File parent, String
child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者
相对路径
File(String parent, String
child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用
路径表示

File 类的方法:

它的方法有很多,不一一列举

值类型方法签名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返
回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到
JVM 运行结束时才会进行

还有其他的方法,我们要用到时,可以自己去查,而且我们看名字其实就可以知道这些方法的作用了。

具体的代码演示我在这里不过多演示。

文件内容操作:

计算机对文件操作有很多种操作,我们将其分为很多组类。

  1. 针对文本文件操作提供了一组类,统称为 " 字符流 "(典型代表:Reader、Writer)读写的基本单位是字符。
  2. 针对二进制文件操作提供了一组类,统称为 " 字节流 "(典型代表:InputStream、OutputStream) 读写的基本单位是字节。

流的原理解析:

流其实我们可以想象成一个“水管”,源端和目的端就是两个“水桶”,数据是通过这个“水管”进行流动传输的,以InputStream和Reader为例,水管的每个“水滴”就是具体的数据,如果是字节流,那么一个“水滴”就是一个字节,如果是字符流,那么一个“水滴”就是一个字符。

当创建一个流对象的时候,如fis=new FileInputStream(“…\xx\xx.txt”),记录指针来表示当前正准备从哪个“水滴”开始读取,每当程序从InputStream或者Reader里面取出一个或者多个“水滴”后,记录指针自定向后移动;除此之外,InputStream和Reader里面都提供了一些方法来控制记录指针的移动。

如果是处理流的话,就相当于在这个水管上面装了一些“控制阀门”,最终用户只要关心“阀门”具备的能力就行

 

 按照流的流向来分,可以分为输入流和输出流。输入,输出都是从程序运行所在内存的角度来划分的。

  1. 输入流:只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类。
  2. 输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类。

按照流的角色来分,可以分为节点流和处理流。

  1. 节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
  2. 处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流

java.io 这个包下有很多流,我们不需要一个个去看,很多时候知道原理,直接去查就可以了,我去抄一张人家大佬总结出来的图:

接下来介绍四种常见的流。

Java IO流四大家族:

四大家族的首领:

  • java.io.InputStream 字节输入流
  • java.io.OutputStream 字节输出流
  • java.io.Reader 字符输入流
  • java.io.Writer 字符输出流

四大家族的首领都是抽象类。(abstract class):

 所有的流都实现了:

java.io.Closeable接口,都是可关闭的,都有close()方法: 

有的输出流都实现了:

java.io.Flushable接口,都是可刷新的,都有flush()方法。刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据。作用就是清空管道。没有flush()可能会导致丢失数据。

在java中只要“类名”以Stream结尾的都是字节流。以“Reader/Writer”结尾的都是字符流。

四大家族首领常用方法:

1.InputStream(字节输入流)

  1. void close() 关闭此输入流并释放与该流关联的所有系统资源。
  2. abstract int read() 从输入流读取下一个数据字节。
  3. int read(byte[] b) 从输入流中读取一定数量的字节并将其存储在缓冲 区数组 b 中。
  4. int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入字节数组。

2.OutputStream(字节输出流)

  1. void close() 关闭此输出流并释放与此流有关的所有系统资源。
  2. void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
  3. void write(byte[] b) 将 b.length 个字节从指定的字节数组写入此输出 流。
  4. void write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字 节写入此输出流。
  5. abstract void write(int b)将指定的字节写入此输出流。

3.Reader(字符输入流)

  1. abstract void close() 关闭该流。
  2. int read() 读取单个字符。
  3. int read(char[] cbuf) 将字符读入数组。
  4. abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分

4.Writer(字符输出流)

  1.  Writer append(char c) 将指定字符追加到此 writer。
  2. abstract void close() 关闭此流,但要先刷新它。
  3. abstract void flush() 刷新此流。
  4. void write(char[] cbuf) 写入字符数组。
  5. abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
  6. void write(int c) 写入单个字符

具体的代码这里就不演示了。


http://www.kler.cn/a/9845.html

相关文章:

  • Qwen2 系列大型语言模型
  • 大语言模型在序列推荐中的应用
  • 软考:去中心化的部署有什么特点
  • 【Python特征工程系列】利用SHAP进行特征重要性分析-XGB模型为例(案例+源码)
  • AndroidStudio-文本显示
  • 客户手机号收集小程序有什么用
  • 黑马2023JavaScript笔记
  • 鸿鹄工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统
  • 若依数据隔离 ${params.dataScope} 替换 优化为sql 替换
  • 【SQL 必知必会】- 第十三课 创建高级联结
  • Python求矩阵的内积、外积、克罗内克直积、Khatri-Rao积
  • 医院不良事件上报系统源码,全套源代码
  • Spring框架中的Bean
  • QML控件--Container
  • 每日一问-ChapGPT-20230414-中医基础-四诊之问诊
  • vue3 history模式配置及nginx服务器配置
  • gRPC源码解读 传输层数据处理流程
  • 【spring】通过抽象类与ApplicationContext编写扩展性强的业务逻辑
  • 使用国密SSL证书,实现SSL/TLS传输层国密改造
  • 【你听说了吗】GPT-5据说已经学完了世界上现存所有的视频
  • 电脑自动录屏软件哪个好用 电脑自动录屏怎么设置
  • 剑指 Offer 49. 丑数
  • 【计算机组成原理 - 第二章】系统总线(完结)
  • css 导航栏效果
  • ICPC SWERC 2020 K - Unique Activities(SAM记录子串第一次结束位置 or SAM + hash)
  • ​分析新特征背后的内在逻辑,才能把握未来一段时期的科技发展新方向