目录
- [Day 15:文件IO(1)](#Day 15:文件IO(1))
Day 15:文件IO(1)
IO
-
I:Input输入
-
O:Output输出
输入输出规则
统一以CPU为基准,通过控制台读取数据到内存是输入;把数据打印显示到控制台上是输出
文件
文件本身是广义的概念,在操作系统中把很多的资源(软件资源/硬件资源)都抽象成文件,但此处谈到的文件,特指狭义 的文件,也就是平时保存在硬盘上的这些文件
文件夹也是一种文件 ,称为目录文件,也是保存在硬盘上,在硬盘上,存在很多文件和目录,目录又存在一定的嵌套关系,整体这一套结构是一个树型结构
1. 路径
文件非常多,目录也非常多,目录之间还能嵌套,需要在上述体系中能够有一种方式,标识某个具体的文件,通过这个机制,就能具体定位到某个文件上
从根节点出发,一层一层往下走,最终到达目标文件之后,中间这些目录集合在一起,就构成了路径
- 绝对路径:以盘符开头的路径,起点是此电脑
- 相对路径:起点可以是任意路径
D:\program\qq\Bin\qq.exe
:目录和目录之间,使用/或者\分割,但是这个事情只局限在Windows上
据说微软在开发DOS的时候,最初定义的目录分隔符是/,当时主流系统Unix家族,都是/表示的,但是在发布之前,产品经理,突然改需求,改成\表示,发布之后,遭到怒喷,之后也开始支持/,现在Windows同时支持/和\两种,Linux、Mac、Android和IOS都是Unix的后裔,只支持/,因此推荐使用/
**例子:**找qq.exe
- 当前的基准(工作目录)是
D:\program\qq\Bin
,直接通过./qq.exe
找到,.
在相对路径中表示当前所在的位置 - 当前的基准(工作目录)是
D:\program\qq
,通过./Bin/qq.exe
找到 - 当前的基准(工作目录)是
D:\program
,通过./qq/Bin/qq.exe
找到 - 当前的基准(工作目录)是
D:\program\qq\Bin\plugins
,此时需要通过..
回到上一级目录,../qq.exe
找到
Linux和Windows的相对路径/绝对路径规则完全相同
2. 文件的分类
文件的分类方式有很多种,此处主要讨论一种和编写代码密切相关的
- 文本文件 :在硬盘上存储的数据是++文本数据++,给人看的
- 二进制文件 :在硬盘上存储的数据是++二进制数据++,给程序看的
无论是文本文件还是二进制文件,本质上都是01这样的二进制数据,文本数据指的是字符串每个部分都是"合法",文本文件中的二进制数据能够构成合法的字符(GBK/UTF8等码表有对应),区分一个文件是文本还是二进制,在编码处理的时候,处理方式不同
一个简单粗暴但是有效的区分二进制文件和文本文件的方法,使用记事本打开,如果不是乱码就是文本文件,否则就是二进制文件,记事本属于把文件内容,按照文本的方式来理解,如果理解成功,也就意味着查表成功了,不理解就是二进制文件
日常常见的一些:docx、pptx、MP3、MP4、pdf都属于二进制文件,md、html、java、c都属于文本文件
docx是富文本,不仅仅是把文本,还包含格式、样式等其他很多信息,总体是通过二进制来表示的
3. 使用Java针对文件系统进行操作
Java标准库提供了File类表示一个文件,进一步的通过File提供的方法,就可以进行文件系统操作了
File类出自于
java.io
包里面,和输入输出相关的内容就是在这个包里面
3.1 属性
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char类型的表示 |
pathSeparator:Java为了能够跨平台,专门提供了变量,如果是windows版本的jdk上述变量值就是\,如果是Linux/mac版本的jdk就是/
3.2 构造方法
签名 | 说明 |
---|---|
File(File parent, String child) | 根据父目录+孩子文件路径,创建⼀个新的File实例 |
File(String pathname) | 根据文件路径创建⼀个新的File实例,路径可以是绝对路径或者相对路径 |
File(String parent, String child) | 根据父目录+孩子文件路径,创建⼀个新的File实例,父目录用路径表示 |
字符串类型的路径,绝对路径/相对路径都是可以的,构造File对象的时候,写的路径不一定非得真实存在
3.3 方法
Flie类中的方法,操作系统都有api,Java调用了系统api,系统本身的api都是C/C++实现的,JVM本身就是C++,JVM里能够调用系统api,进一步封装一下,提供给上层Java程序调用
代码示例一
java
package IO;
import java.io.File;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File f = new File("d:/test.txt");
System.out.println(f.getParent());//返回File对象的⽗⽬录⽂件路径
System.out.println(f.getName());//返回FIle对象的纯⽂件名称
System.out.println(f.getPath());//返回File对象的⽂件路径
System.out.println(f.getAbsoluteFile());//返回File对象的绝对路径
System.out.println(f.getCanonicalPath());//返回File对象的修饰过的绝对路径
}
}
d:\
test.txt
d:\test.txt
d:\test.txt
D:\test.txt
java
package IO;
import java.io.File;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File f = new File("./test.txt");
System.out.println(f.getParent());//返回File对象的⽗⽬录⽂件路径
System.out.println(f.getName());//返回FIle对象的纯⽂件名称
System.out.println(f.getPath());//返回File对象的⽂件路径
System.out.println(f.getAbsoluteFile());//返回File对象的绝对路径
System.out.println(f.getCanonicalPath());//返回File对象的修饰过的绝对路径
}
}
.
test.txt
.\test.txt
D:\JAVA_CODE\J2024_04_19_IO\.\test.txt
D:\JAVA_CODE\J2024_04_19_IO\test.txt
-
throws IOException
:表示输入输出过程中出现问题的异常,异常信息中会告诉我们具体的错误原因 -
"./test.txt"
:在IDEA里,直接运行程序,此时基准目录就是项目所在目录 -
f.getAbsoluteFile()
:把当前的工作路径和相对路径进行简单的拼接 -
f.getCanonicalPath()
:对上面方法拼接后的结果进行省略
代码示例二
java
package IO;
import java.io.File;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
File f = new File("./test.txt");
f.createNewFile();//根据File对象,⾃动创建⼀个空⽂件。成功创建后返回true
System.out.println(f.exists());//判断File对象描述的⽂件是否真实存在
System.out.println(f.isFile());//判断File对象代表的⽂件是否是⼀个普通⽂件
System.out.println(f.isDirectory());//判断File对象代表的⽂件是否是⼀个⽬录
}
}
true
true
false
创建文件什么情况下会失败:给出的路径非法/权限不足
代码示例三
java
package IO;
import java.io.File;
public class Demo3 {
public static void main(String[] args) {
File f = new File("./test.txt");
f.delete();//根据File对象,删除该⽂件。成功删除后返回true
System.out.println(f.exists());
}
}
false
java
package IO;
import java.io.File;
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
File f = new File("./test.txt");
Scanner scanner = new Scanner(System.in);
f.deleteOnExit();//根据File对象,标注⽂件将被删除,删除动作会到JVM运⾏结束时才会进⾏
scanner.next();
System.out.println(f.exists());
}
}
f.deleteOnExit();
有些程序,运行过程中,会产生临时文件,就需要在进程结束之后,自动删除掉,这样的情况,就可以使用该方法
代码示例四
java
package IO;
import java.io.File;
public class Demo4 {
public static void main(String[] args) {
File dir = new File("./testDir");
dir.mkdir();//创建File对象代表的⽬录
System.out.println(dir.isDirectory());//判断File对象代表的⽂件是否是⼀个⽬录
File dirs = new File("./testDirs/AAA/BBB/CCC");
dirs.mkdirs();//创建File对象代表的⽬录,如果必要,会创建中间⽬录
System.out.println(dirs.isDirectory());
}
}
代码示例五
java
package IO;
import java.io.File;
public class Demo5 {
public static void main(String[] args) {
File f1 = new File("./test2.txt");
File f2 = new File("./testDir/test2.txt");
f1.renameTo(f2);//进⾏⽂件改名,也可以视为我们平时的剪切、粘贴操作
}
}