文件操作IO
文章目录
前言
IO 即 Input(输入)和 Output(输出)。以计算机为视角,程序员向计算机写入数据即为输入。
一、文件概念
文件存储在硬盘中。操作系统对硬盘进行了封装,而 Java 又对操作系统进行了封装。因此,对于 Java 开发者而言,想要操作硬盘,只需调用文件相关的 API 即可。文件本质上是操作系统对硬盘上数据进行抽象封装的体现。
文件分为普通文件和目录文件(文件夹),其保存结构为树形结构。
二、路径
使用"路径"来描述某个文件或目录所在的位置。
-
绝对路径 :从盘符开始书写的路径。例如:
D:\JavaDamo\Trae-cn\picture-demo\src\main\resources -
相对路径:以某个基准目录为起点,从该目录出发找到目标文件。例如:
- 以
D:\JavaDamo\Trae-cn\picture-demo\src\main为基准,相对路径为.\resources - 以
D:\JavaDamo\Trae-cn\picture-demo为基准,相对路径为.\src\main\resources - 若要找 main 下的 Java 目录,则以
D:\JavaDamo\Trae-cn\picture-demo\src\main\resources为基准,相对路径为.\Java
- 以
.表示当前目录
..表示上一级目录
三、斜杠
如果路径以
.\开头,可以省略。相对路径是常用的表示方式。
上述示例中使用 \ 作为目录之间的分隔符,使用 / 也是可以的。更正统的做法是:/ 叫斜杠,\ 叫反斜杠,二者有固定定义。尤其在代码中,使用 \(尤其是在字符串里)需要转义,因此推荐使用斜杠 /。
四、文件类型
文件的分类方式有多种,如普通文件、目录文件、视频文件、音频文件等。
站在文件存储的角度,可分为:
- 文本文件:内部存储的内容是"字符串",每个部分都是一个"字符"。
- 二进制文件:无格式限制,可存储任意数据。
操作文件前,需要先判断文件是文本文件还是二进制文件,因为二者的编码方式存在差异。分辨方法:用记事本打开文件,若出现乱码则为二进制文件。
五、操作
- 文件系统操作
文件系统是操作系统对于文件管理的子模块 , 对文件进行创建移动查看目录等操作 - 文件内容操作
对文件进行读和写
六、系统操作file类 , 不用背
常用构造方法
File(String path) 这里面放路径 , 一个File就对应一个文件/目录 , 可以是绝对路径 , 也可以是相对对路径 , 相对路径的基准路径是取决于程序运行时所在的工作目录
File对象定义的时候 , 指定的路径不一定非要存在 , 他有一个功能 , 创建的文件 , 但只是在内存中创建 , 不会真的在硬盘上
相对路径的时候 , 会进行化简 , 把./去掉
Demo1看示范案例
| String getParent() | 返回 File 对象的⽗⽬录⽂件路径 |
| String getName() | 返回 FIle 对象的纯⽂件名称 |
| String getPath() | 返回 File 对象的⽂件路径 |
| String getAbsolutePath() | 返回 File 对象的绝对路径 |
| String getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
创建文案这个方法有可能失败 , 1. 硬盘满了 2. 没有权限
删除这个操作 , 不是放进回收站 , 是直接从硬盘上删除
下面那个删除不是立刻删除 , 是等线程退出后才删除 , 针对临时使用的文件
| boolean exists() | 判断 File 对象描述的⽂件是否真实存在 |
| boolean isDirectory() | 判断 File 对象代表的⽂件是否是⼀个⽬录 |
| boolean isFile() | 判断 File 对象代表的⽂件是否是⼀个普通⽂件 |
| boolean createNewFile() | 根据 File 对象,⾃动创建⼀个空⽂件。成功创建后返回 true |
| boolean delete() | 根据 File 对象,删除该⽂件。成功删除后返回 true |
| void deleteOnExit() | 根据 File 对象,标注⽂件将被删除,删除动作会到 JVM 运⾏结束时才会进⾏ |
修饰符及返回值类型 ⽅法签名 说明
String\[\] list() 返回 File 对象代表的⽬录下的所有
⽂件名
File\[\] listFiles() 返回 File 对象代表的⽬录下的所有
⽂件,以 File 对象表⽰
加上s表示我们支持创建一组路径
boolean mkdir() 创建 File 对象代表的⽬录
boolean mkdirs() 创建 File 对象代表的⽬录,如果必
要,会创建中间⽬录
在操作系统中 , 重命名和移动都是同一个操作 , 就看目标改为一个什么样的路经 , 如果保持前面的路径不变 , 只是把名字改一下就不是移动 , 如果前面的路径也改了 , 就会产生移动效果了
boolean renameTo(File dest) 进⾏⽂件改名,也可以视为我们平
时的剪切、粘贴操作
boolean canRead() 判断⽤⼾是否对⽂件有可读权限
boolean canWrite() 判断⽤⼾是否对⽂件有可写权限
文件内容操作
主要两个操作
读和写
针对文件内容操作 , Java标准库操作采用了一组流对象(一组类)表示
Java标准库中 , 分出了两个大类 ,
字节流
读写的时候 , 以字节为单位 , 适合处理二进制文件
InputStream 输入 , 只需要读
OutputStream
都是抽象类
对应了若干子类
FileInoutStream
FileOutputStream
字符流
读写的时候 , 以字符为单位 , 适合处理文本文件
Reader
Writer
都是抽象类 , 对应了若干子类
FileReader
FileWriter
微信
一开始用try catch
有catch了不一定执行到close
把它放到finally里面,不在作用域内
InputStream在try外面创建对象
太丑了
用try with resources,括号里面创建,自动close
读到末尾返回-1
一个try里面可以定义多个流对象 , 多个流对象之间可以使用 ; 分割
用outputstream , 默认情况下 , 打开文件会先清空文件内容 , 但我们可以加第二个参数true让他不清空
write一次写一个字节 , 一次写一个完整字节数组 , 写字节数组的一部分可以定义从数组的哪里开始写写多长
read一次第一个字符,一次读一个字符数组,和上面一样就是封装一下,第四个read(byte\[\] b, int off, int len) Java IO
三个参数 1. b:byte数组,缓冲区,读到的数据存到这个数组里2。 off(offset偏移量):从数组 b 的第off下标位置开始存放读到的数据3. len:最多读取len个字节(不是一定读到len个,只是上限)
读到末尾返回-1
writer使用最多的直接传入一个字符串
Scanner搭配inputstream
PrintWriter可以进行格式化输出
printwriter.print("%d+%d=%d" , 12,13,25);