【文件IO】文件系统操作

简介: 【文件IO】文件系统操作

基本操作概述

  • 创建文件
  • 删除文件
  • 创建目录
  • 重命名文件
  • 判定文件存在…

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 实例,⽗⽬录⽤路径表⽰
此处写相对路径的时候,就需要明确基准目录是啥,代码中写的相对路径的基准目录取决于运行程序的方式
  1. 直接在 IDEA 中运行,此时的基准路径就是该项目所在的目录
  2. 再命令行中,通过 Java 命令来运行,此时基准路径就是 Java 命令所处的目录
  3. 某个程序可能是被其他进程调用的。进程 1 通过创建字进程的方式运行进程 2,进程 2 的基准路径就和进程 1 相同
  4. 代码执行过程中,还可以通过一些 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

创建文件,很可能会抛出异常

  1. 硬盘空间不够了
  • 在工作中,非常普遍,尤其是服务器,存储很多数据,会记录很多日志,每天都会生成很多新的内容
  • 一般都需要定时清理硬盘,搭建报警
  1. 没有权限
  • 确保你有操作的权限,才能进行
  • 对于文件的操作,典型的就是两个(读/写)

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. 遍历目录

  • 若要完成递归操作就需要一个函数来辅助完成
  1. 首先判断是不是目录
  2. 用数组,列出当前目录中所包含的内容
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);  
    }}
  • 移动 文件,就是修改文件所在的路径,文件路径的修改,也可以视为一种


相关文章
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2月前
|
搜索推荐 索引
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
42 2
|
2月前
|
编解码 Java 程序员
【文件IO】文件内容操作
【文件IO】文件内容操作
58 2
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
242 12
|
2月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
39 0
|
3月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
4月前
|
存储 监控 Linux
性能分析之从 IO 高定位到具体文件
【8月更文挑战第21天】性能分析之从 IO 高定位到具体文件
49 0
性能分析之从 IO 高定位到具体文件
|
4月前
IO流拷贝文件的几种方式
IO流拷贝文件的几种方式
39 1
|
5月前
|
Linux 数据处理 C语言
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
84 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。