【文件IO】文件系统操作

news/2024/9/25 2:44:32/

文章目录

  • 基本操作概述
  • 1. 文件属性
  • 2. 文件构造方法
  • 3. 文件方法
    • 1. 文件创建
    • 2. 文件删除
    • 3. 查看目录下所有的文件名
    • 4. 遍历目录
    • 5. 创建目录
    • 5. 目录重命名

基本操作概述

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

Java 中,提供了一个 File 类,进行文件系统操作,这个对象会使用“路径”进行初始化,从而表示一个具体的文件(这个文件可以存在,也可以不存在)
再基于这个对象进行后续操作


1. 文件属性

属性: 文件路径的分隔符

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表⽰
static charpathSeparator依赖于系统的路径分隔符,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. 文件方法

方法:

修饰符及返回值类型方法签名说明解释
StringgetParent()返回 File 对象的⽗⽬录⽂件路径获取文件所在的目录
C:\user\1
StringgetName()返回 FIle 对象的纯⽂件名称获取文件名
test.txt
StringgetPath()返回 File 对象的⽂件路径获取当前文件所在的目录+当前文件名
C:\user\1\text.txt
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的⽂件是否真实存在看文件存不存在
booleanisDirectory()判断 File 对象代表的⽂件是否是⼀个⽬录判断文件类型
booleanisFile()判断 File 对象代表的⽂件是否是⼀个普通⽂件判断文件类型
booleancreateNewFile()根据 File 对象,⾃动创建⼀个空⽂件。成功创建后返回 true创建新文件
booleandelete()根据 File 对象,删除该⽂件。成功删除后返回 true立即删除文件
voiddeleteOnExit()根据 File 对象,标注⽂件将被删除,删除动作会到 JVM 运⾏结束时才会进⾏等到程序结束后,删除文件
String[]list()返回 File 对象代表的⽬录下的所有⽂件名得到目录下所有文件名
File[]listFiles()返回 File 对象代表的⽬录下的所有⽂件,以 File 对象表⽰得到目录下所有文件对象
booleanmkdir()创建 File 对象代表的⽬录创建一级目录
booleanmkdirs()创建 File 对象代表的⽬录,如果必要,会创建中间⽬录创建多级目录
booleanrenameTo(File dest)进⾏⽂件改名,也可以视为我们平时的剪切、粘贴操作重命名
booleancanRead()判断⽤⼾是否对⽂件有可读权限判断读权限
booleancanWrite()判断⽤⼾是否对⽂件有可写权限判断写权限

  • 一定要使用双反斜杠表示 \
java">File file = new File("D:\\My Computer\\02 Stricky\\02 Code\\03 IDEA");
java">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 打开的这个项目所在的路径

java">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. 文件创建

java">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

image.png|238

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

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

2. 文件删除

java">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

image.png|151

  • 文件消失了
  • 还有一种是等待进程结束之后再进行删除的操作:deletOnExit(),存在的意义就是可以去构造一些“临时文件”
    • 比如使用 word 创建一个文档,打开“显示隐藏文件”,在你 word 文档的同级目录下,就有一个隐藏文件,名字带有一些奇怪符号,一旦你把现在编辑的文档关闭了,这个隐藏文件就消失了
    • 这个隐藏文件中保存了你当前正在修改的,还未真正保存的内容
    • 若程序异常关闭,临时文件就不会消失,就可以通过这个文件,还原出你正在编辑的内容

3. 查看目录下所有的文件名

java">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. 用数组,列出当前目录中所包含的内容
java">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()
java">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

image.png|287


  • mkdirs(),可以处理多级目录
java">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);  }
}

image.png|211

5. 目录重命名

java">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);  }
}

image.png|529

  • 通过重命名操作,实现移动文件的效果
java">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);  }}
  • 移动 文件,就是修改文件所在的路径,文件路径的修改,也可以视为一种
    image.png|363

http://www.ppmy.cn/news/1508730.html

相关文章

postman常用的使用方法

1.将get请求的参数变为环境参数 添加“pre-request Script” var id pm.request.url.query.get("id") pm.environment.set("id", id); 2.将接口响应结果放置全局参数 添加“Tests” var data pm.response.json() var id data.id; pm.globals.…

Unity射击游戏开发教程:(31)制造一定追踪行为的敌人

在本文中,我们将介绍如何在两种敌人行为之间切换。本文是前两篇文章的延续,分别介绍了敌人躲避玩家射击以及敌人不断旋转并向玩家射击的情况。我只是介绍如何在这两种行为之间进行转换。 这种新的敌人行为的目标: 当不开火时,敌人可以躲避玩家的射击。射击时,敌人无法躲避…

RabbitMq的事务机制

RabbitMQ中与事务机制有关的方法有三个:txSelect(), txCommit()以及txRollback(), txSelect用于将当前channel设置成transaction模式,txCommit用于提交事务,txRollback用于回滚事务,在通过txSelect开启事务之后,我们便…

opencv-python图像增强一:传统图像去噪方法整理

一、简介: 在数字图像处理领域,噪声一直是影响图像质量的重要因素。无论是拍摄过程中的环境干扰,还是传输过程中的信号失真,噪声都可能导致图像模糊、细节丢失,甚至影响后续的图像分析和应用。为了提高图像的视觉效果…

24/8/8算法笔记 决策树构建鸢尾花

决策树是一种由算法自动设计的模型。在机器学习中,构建决策树的过程通常遵循以下步骤: 特征选择:算法会评估每个特征,并选择一个特征作为节点分裂的依据。这个选择基于某种准则,如信息增益(ID3算法&#xf…

《王道》课后练习1:栈

03: 栈的初态和终态均为空,以I和O分别表示入栈和出栈,则出入栈的操作序列可表示为由I和O组成的序列,可以操作的序列称为合法序列,否则称为非法序列。 1)下面所示的序列中哪些是合法的? 分析:…

redis 入门,一起学习redis

文章目录 一、什么是redis? redis的作用?二、redis的特点三、redis的基本数据结构类型四、redis 的三种特殊数据类型五、redis 作为缓存六、redis 作为缓存存在的问题6.1 数据一致性6.2 缓存雪崩6.3 缓存穿透6.4 缓存击穿 七、redis为什么那么快?八、re…

C语言——预处理详解(下)

目录 前言 #和## 1.#运算符 2.##运算符 命名约定 #undef 命令行定义 条件编译 1.单分支条件编译 2.多分支条件编译 3.判断是否被定义 4.嵌套指令 头文件的包含 1.头文件被包含的方式 (1)本地文件包含 (2)库文件包含 2.嵌套文件包含 其他预处理指令 1.#error…