本文要讲述的我们在计算机中经常见到的一个东西 ---- 文件, 在不同的文件系统中, 管理文件的方式其实都是类似的, 本文将带领读者认识文件, 利用 Java 操作文件.
关注收藏, 开始学习吧
我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。
随着文件越来越多, 对文件的系统管理也被提上了日程. 在不同的文件系统下, 对于文件的操作都是大致相同的, 通过层级结构进行组织, 用 “目录 - 目录 - 目录 - 文件” 这种形式构成了 “N叉树” 数据结构, 这也就是我们平时所谓文件夹 (folder) 或者目录 (directory) 的概念.
如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。
除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径。
以盘符为开头的路径, 就是绝对路径. 绝对路径相当于从 “此电脑” 出发, 然后去找文件的过程.
绝对路径大致格式:
C:/temp/test1.txt
表示在 C 盘下, temp 目录中一个名为 test1 的 .txt
文件.
以 . 或者 … 开头的路径, 就是相对路径. ./
表示当前所在目录, ../
表示当前所在目录的上层目录. 相对路径需要有一个 “基准目录”, 表示从这个基准目录出发, 然后去找文件的过程.
相对路径大致格式:
./temp/test1.txt
如果以 C: 为基准目录, 这表示寻找 test1.txt 的过程.
../test1.txt
是表示如果以 C:/temp/111 为基准目录, 从 111 的上层目录中 temp 中寻找 text1.txt.
即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。
文本文件存储的是字符, 二进制文件存储的是二进制数据. 一个最简单的方式来判断文件是二进制还是文本, 就是直接使用记事本打开文件. 如果打开后能看懂, 那就是文本文件, 看不懂, 就是二进制文件. 记事本打开文件, 就是尝试把当前的数据在码表中进行查询.
请大家掌握判断文件的方法, 因为后续我们使用 Java 操作文件时, 两种文本的操作方式是不同的.
Java 中通过 java.io.File
类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。
通过 File 对象来描述一个具体的文件, File 对象也可以对应到一个真实存在的文件, 也可以对应到一个不存在的文件.
我们先来看一看 Java 中 File 类中常见的一些方法.
签名 | 说明 |
---|---|
File(File parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
此处参数的字符串, 就表示一个路径, 可以是文件的绝对路径, 也可以是从当前工作目录出发的相对路径.
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
String | getParent() | 返回 File 对象的父目录文件路径 |
String | getName() | 返回 FIle 对象的纯文件名称 |
String | getPath() | 返回 File 对象的文件路径 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
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 对象表示 |
boolean | mkdir() | 创建 File 对象代表的目录 |
boolean | mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
boolean | renameTo(Filedest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
import java.io.File;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
File file = new File("../test1.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
运行结果
import java.io.File;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
// 要求该文件不存在, 才能看到同样的现象
File file = new File("test2.txt");
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());
}
}
运行结果
import java.io.File;
import java.io.IOException;
public class Test3 {
public static void main(String[] args) throws IOException {
// 要求该文件不存在, 才能看到同样的现象
File file = new File("test3.txt");
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.delete());
System.out.println(file.exists());
}
}
运行结果
import java.io.File;
import java.io.IOException;
public class Test4 {
public static void main(String[] args) throws IOException {
// 要求该文件不存在, 才能看到同样的现象
File file = new File("test4.txt");
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
file.deleteOnExit();
System.out.println(file.exists());
}
}
运行结果
import java.io.File;
public class Test5 {
public static void main(String[] args) {
// 要求该目录不存在, 才能看到同样的现象
File dir = new File("testDir");
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
运行结果
import java.io.File;
public class Test6 {
public static void main(String[] args) {
File dir = new File("parentDir/childDir");
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdirs());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
运行结果
可以看到, 当使用 mkdir() 创建多层目录的时候,如果中间目录不存在,则无法创建成功; 但是 mkdirs() 就可以解决这个问题。
import java.io.File;
import java.io.IOException;
public class Test7 {
public static void main(String[] args) throws IOException {
File srcFile = new File("srcFile.txt");
srcFile.createNewFile();
File dstFile = new File("dstFile.txt");
System.out.println(srcFile.exists());
System.out.println(dstFile.exists());
System.out.println(srcFile.renameTo(dstFile));
System.out.println(srcFile.exists());
System.out.println(dstFile.exists());
}
}
运行结果
以上对文件系统的操作, 都是基于 File 类来实现的, 下篇文章还会学习对文件内容的读写操作.
✨ 本文主要讲述了文件的概念, 还学习了如何使用 Java 来操作文件. 下篇文章我们还会继续探讨对文件内容的读写操作, 两个数据流.
✨ 想了解更多知识, 请持续关注博主, 本人会不断更新学习记录, 跟随我一起不断学习.
✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.
再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!