基本操作概述
- 创建文件
- 删除文件
- 创建目录
- 重命名文件
- 判定文件存在…
Java
中,提供了一个 File
类,进行文件系统操作,这个对象会使用“路径”进行初始化,从而表示一个具体的文件(这个文件可以存在,也可以不存在)
再基于这个对象进行后续操作
1. 文件属性
属性: 文件路径的分隔符
修饰符及类型 | 属性 | 说明 |
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表⽰ |
static char | pathSeparator | 依赖于系统的路径分隔符,char 类型的表⽰ |
2. 文件构造方法
构造方法:
签名 | 说明 |
File (File parent, String child) | 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例 |
File (String pathname) |
根据⽂件路径创建⼀个新的 File 实例,路径可以是绝对路径或者相对路径 |
File (String parent, String child) | 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例,⽗⽬录⽤路径表⽰ |
此处写相对路径的时候,就需要明确基准目录是啥,代码中写的相对路径的基准目录取决于运行程序的方式 |
- 直接在 IDEA 中运行,此时的基准路径就是该项目所在的目录
- 再命令行中,通过 Java 命令来运行,此时基准路径就是 Java 命令所处的目录
- 某个程序可能是被其他进程调用的。进程 1 通过创建字进程的方式运行进程 2,进程 2 的基准路径就和进程 1 相同
- 代码执行过程中,还可以通过一些 API 修改基准路径,改成我们指定的某个路径
3. 文件方法
方法:
修饰符及返回值类型 | 方法签名 | 说明 | 解释 |
String | getParent() | 返回 File 对象的⽗⽬录⽂件路径 | 获取文件所在的目录C:\user\1 |
String | getName() | 返回 FIle 对象的纯⽂件名称 | 获取文件名test.txt |
String | getPath() | 返回 File 对象的⽂件路径 | 获取当前文件所在的目录+当前文件名C:\user\1\text.txt |
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(File dest) | 进⾏⽂件改名,也可以视为我们平时的剪切、粘贴操作 | 重命名 |
boolean | canRead() | 判断⽤⼾是否对⽂件有可读权限 | 判断读权限 |
boolean | canWrite() | 判断⽤⼾是否对⽂件有可写权限 | 判断写权限 |
显示详细信息
- 一定要使用双反斜杠表示
\
,
File file = new File("D:\\My Computer\\02 Stricky\\02 Code\\03 IDEA");
import java.io.File; import java.io.IOException; public class Demo1 { public static void main(String[] args) throws IOException { File file = new File("D:\\My Computer\\02 Stricky\\02 Code\\03 IDEA\\text.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.getCanonicalFile()); //修饰过的绝对路径 } } //运行结果 D:\My Computer\02 Stricky\02 Code\03 IDEA text.txt D:\My Computer\02 Stricky\02 Code\03 IDEA\text.txt D:\My Computer\02 Stricky\02 Code\03 IDEA\text.txt D:\My Computer\02 Stricky\02 Code\03 IDEA\text.txt
我们可以发现,最后三个路径没区别
- 因为我们针对
file
对象构造的时候,是拿绝对路径进行构造的,所以此时的Path
就是一个绝对路径,于是三个getPath
就都是一样的
相对路径的基准不是固定的,此时我们通过 IDEA 运行程序,基准路径就是 IDEA 打开的这个项目所在的路径
import java.io.File; import java.io.IOException; public class Demo1 { public static void main(String[] args) throws IOException { File file1 = new File(".\\text.txt"); System.out.println(file1.getParent()); System.out.println(file1.getName()); System.out.println(file1.getPath()); System.out.println(file1.getAbsolutePath()); System.out.println(file1.getCanonicalFile()); System.out.println("======================"); File file2 = new File("..\\text.txt"); System.out.println(file1.getParent()); System.out.println(file1.getName()); System.out.println(file1.getPath()); System.out.println(file1.getAbsolutePath()); System.out.println(file1.getCanonicalFile()); } } //运行结果 . text.txt .\text.txt D:\My Computer\02 Stricky\02 Code\03 IDEA\Gitee\java_code\240812-IO\.\text.txt D:\My Computer\02 Stricky\02 Code\03 IDEA\Gitee\java_code\240812-IO\text.txt ====================== . text.txt .\text.txt D:\My Computer\02 Stricky\02 Code\03 IDEA\Gitee\java_code\240812-IO\.\text.txt D:\My Computer\02 Stricky\02 Code\03 IDEA\Gitee\java_code\240812-IO\text.txt
- 修饰过的绝对路径就是把多余的部分去掉了
.
就是当前目录,..
是代表忽略掉上一级目录
1. 文件创建
import java.io.File; import java.io.IOException; public class Demo2 { public static void main(String[] args) throws IOException { File file = new File("./text1.txt"); boolean ok = file.createNewFile(); //创建新文件 System.out.println(ok); //看文件创建是否成功 System.out.println(file.exists()); //看文件是否存在 System.out.println(file.isFile()); //看文件是否是个普通文件 System.out.println(file.isDirectory()); //看文件是否是一个目录 } } //运行结果 true true true false
IOException
创建文件,很可能会抛出异常
- 硬盘空间不够了
- 在工作中,非常普遍,尤其是服务器,存储很多数据,会记录很多日志,每天都会生成很多新的内容
- 一般都需要定时清理硬盘,搭建报警
- 没有权限
- 确保你有操作的权限,才能进行
- 对于文件的操作,典型的就是两个(读/写)
2. 文件删除
import java.io.File; public class Demo3 { public static void main(String[] args) { File file = new File("./text1.txt"); boolean ok = file.delete(); System.out.println(ok); } } //运行结果 true
- 文件消失了
- 还有一种是等待进程结束之后再进行删除的操作:
deletOnExit()
,存在的意义就是可以去构造一些“临时文件”
- 比如使用 word 创建一个文档,打开“显示隐藏文件”,在你
word
文档的同级目录下,就有一个隐藏文件,名字带有一些奇怪符号,一旦你把现在编辑的文档关闭了,这个隐藏文件就消失了- 这个隐藏文件中保存了你当前正在修改的,还未真正保存的内容
- 若程序异常关闭,临时文件就不会消失,就可以通过这个文件,还原出你正在编辑的内容
3. 查看目录下所有的文件名
import java.io.File; import java.util.Arrays; public class Demo4 { public static void main(String[] args) { File file = new File("."); System.out.println(Arrays.toString(file.list())); } } //运行结果 [.gitignore, .idea, 240812-IO.iml, out, src]
- 如果直接使用
list/listFiles
,只能看到当前目录中的内容 - 如果想看到某个目录下所有的目录和文件,就需要递归来完成
4. 遍历目录
- 若要完成递归操作就需要一个函数来辅助完成
- 首先判断是不是目录
- 用数组,列出当前目录中所包含的内容
import java.io.File; public class Demo5 { private static void scan(File currentDir) { //1.先判定是否是目录 if(!currentDir.isDirectory()){ return; } //2.列出当前目录中包含的内容 File[] files = currentDir.listFiles(); if(files == null || files.length == 0){ //不存在的路径 || 空目录 return; } //3.打印当前目录 System.out.println(currentDir.getAbsolutePath()); //4.遍历这里所有的内容,一次进行判断 for(File file : files) { if(file.isFile()) { //如果是普通文件,直接打印文件路径 System.out.println(file.getAbsolutePath()); }else { //如果是空目录,就继续进行递归 scan(file); } } } public static void main(String[] args) { File file = new File("./"); scan(file); } }
5. 创建目录
mkdir()
import java.io.File; public class Demo6 { public static void main(String[] args) { File f = new File("./abc"); boolean ok = f.mkdir(); System.out.println(ok); } } //运行结果 true
mkdirs()
,可以处理多级目录
import java.io.File; public class Demo6 { public static void main(String[] args) { File f = new File("./abc/def/hhh"); boolean ok = f.mkdirs(); System.out.println(ok); } }
5. 目录重命名
import java.io.File; public class Demo7 { public static void main(String[] args) { File srcFile = new File("./abc"); File desrFile = new File("./abc123"); boolean ok = srcFile.renameTo(desrFile); System.out.println(ok); } }
- 通过重命名操作,实现移动文件的效果
import java.io.File; public class Demo7 { public static void main(String[] args) { File srcFile = new File("./abc123/def"); File desrFile = new File("./def"); boolean ok = srcFile.renameTo(desrFile); System.out.println(ok); }}
- 移动 文件,就是修改文件所在的路径,文件路径的修改,也可以视为一种