文件操作和IO(上)

news2025/4/23 10:06:10

绝对路径和相对路径

文件按照层级结构进行组织(类似于数据结构中的树型结构),将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式,一种是绝对路径,另一种是相对路径。

绝对路径:从树型结构的角度来看,树中的每个结点都可以被一条从树的根结点开始,并到达该结点的路径所描述,将这种描述方式称为文件的绝对路径(Absolute Path)。

相对路径:除了从根结点出发,也可以从任意结点出发来找到目标结点,这种描述方式称为相对路径(Relative Path),相对于当前结点的一条路径。

例如test.txt文件的路径,下述描述方式就是绝对路径,以树型结构为例,即从根结点 E: 开始,到目标结点 test.txt

"E:\code_java\Java_EE\test.txt"

绝对路径通常使用 ./ 和 ../ 来进行描述,./ 表示当前目录,../ 表示上级目录,如下所示:

如果此时我们在 Java_EE 目录下,此时:
./test.txt <==> E:/code_java/Java_EE/test.txt
../test.txt <==> E:/code_java/test.txt

文件系统操作 (Java中的File类)

文件系统操作包括创建文件、删除文件、创建目录,重命名等等,Java中通过 java.io.File 类来对一个文件/目录进行抽象的描述,但有File对象,不代表就真实存在该文件,例如下列操作:

File file = new File("E:/code_java/Java_EE/test.txt");

若Java_EE目录下没有test.txt,上述这行代码是可以执行的,创建出了 File 对象,但test.txt实际上是不存在,也就是说 File 对象存在,但真实文件不一定存在。

构造方法

Java 中 File 类的构造方法有以下三种,其中第二种方式用的比较多。

File(File parent, String child) // 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例
File(String pathname) // 根据⽂件路径创建⼀个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, String child) // 根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例,⽗⽬录⽤路径表⽰

File类常用方法

获取 File 类属性

包括获取当前所在目录、文件名、文件路径、绝对路径、相对路径

public static void main(String[] args) throws IOException {
//        File file = new File("E:\\code_java\\demo\\test.txt");// 绝对路径
        File file = new File("../test.txt");
        // 获取当前的目录
        System.out.println(file.getParent());
        // 获取文件名
        System.out.println(file.getName());
        // 获取路径
        System.out.println(file.getParent());
        // 获取绝对路径
        System.out.println(file.getAbsolutePath());
        // 获取File对象修饰过的绝对路径
        System.out.println(file.getCanonicalPath());
    }

其运行结果为:

针对获取相对路径方法 getCanonicalPath 方法输出结果的解释如下:

由于我们是在 JavaEE 文件夹下运行程序的,因此我们此时所在的目录为E:\code_java\Java_EE,此时我们创建的 File 类 file 对象路径为../test.txt,即上一级目录下的 test.txt 文件,即 getCanonicalPath 方法的输出 E:\code_java\test.txt。

如果此时我们将 File 构造方法的路径改为 ./test.txt,getCanonicalPath 方法的输出是 E:\code_java\Java_EE\test.txt

创建文件

在 Java 中创建文件使用 createNewFile 方法,对于文件创建操作,我们可以使用绝对路径来创建,也可以使用相对路径来操作,例如我们要在 E:\code_java\Java_EE 目录下创建一个 test.txt 文件具体操作如下:

 public static void main(String[] args) throws IOException {
        File file = new File("./test.txt"); // 方式1
        File file = new File("../Java_EE/test.txt"); // 方式2
        File file = new File("E:/code_java/Java_EE/test.txt"); // 方式3

        // 创建文件
        boolean ok = file.createNewFile();
        System.out.println(ok);
        // 是否存在
        System.out.println(file.exists());
        // 是否是文件
        System.out.println(file.isFile());
        // 是否是目录
        System.out.println(file.isDirectory());
    }

运行结果为:

第一个 true 表示我们成功创建了 test.txt 文件,第二个 true 表示当前文件存在,第三个 true 表示当前 File 对象是文件,false 表示当前 File 对象不是文件夹。

在 Java 中使用 createNewFile 创建文件需要进行异常处理,原因为:①硬盘空间不足;②用户权限不足(例如用户对于该文件夹只有读权限,无写权限),只有当用户有写权限时才会正常创建,否则就会抛出异常。

删除文件

在 Java删除文件,我们使用 delete 方法,对于文件的删除操作,与创建操作类似,我们可以通过绝对路径、相对路径对其删除,具体代码如下所示:

    public static void main(String[] args) {
        File file = new File("./test.txt");
        File file = new File("E:/code_java/Java_EE/test.txt");
        File file = new File("../Java_EE/test.txt");
        boolean ok = file.delete();
        System.out.println(ok);
    }

除了上述删除方式外,我们也可以通过 deleteOnExit 方法对文件进行删除,这种方式只有当进程结束时才进行文件删除操作,例如如下代码,我们使用 Scanner 来控制进程的结束:

    public static void main(String[] args) {
        // deleteOnExit 在进程退出的时候删除
        File file = new File("./test.txt");
        file.deleteOnExit();
        System.out.println("执行删除完毕");
        Scanner scan = new Scanner(System.in);
        scan.next();
    }

当程序运行起来后,用户任意输入一个内容即可结束进程,进程结束后也就将 test.txt 文件删除了,这就是 deleteOnExit 方法。

该方法存在的意义就是可以用来构造“临时文件”,就类似于我们在 word 中创建一个文档,此时在word 文档的同级目录下就会自动生成一个隐藏文档,一旦我们将当前编辑的文档关闭,这个隐藏文档就自动删除了。这个隐藏文件保存了我们当前正在修改而未保存的内容,当程序异常关闭时,这个文档并不会被删除,我们可以通过这个文档来还原我们正在编辑的文档。

打印目录内容

包括打印当前目录下的内容,当前目录下的内容以及当前目录下子目录的内容。

打印当前目录下的内容我们通过 list 方法来实现,具体代码如下:

public static void main(String[] args) {
        File file = new File(".");
        // 打印当前目录中的内容
        System.out.println(Arrays.toString(file.list()));

    }

如果我们想进一步打印当前目录的内容以及前目录下子目录的内容,可以利用 list 方法和 listFiles方法通过递归的方式来实现,具体代码如下:

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 f : files) {
            if (f.isFile()) {
                // 如果是普通文件,直接打印文件路径
                System.out.println(f.getAbsolutePath());
            } else {
                // 如果是目录,就继续进行递归
                scan(f);
            }
        }
    }
    public static void main(String[] args) {
        File f = new File("./");
        scan(f);

    }

创建文件夹

在 Java 中创建文件夹,我们使用 mkdir 和 mkdirs 两种方法,mkdir 即创建一个文件夹,mkdirs 可以创建多个文件夹。

如果我们要在当前目录下创建一个 abc 文件夹,则可以通过下列代码实现:

    public static void main(String[] args) {
        File f = new File("./abc");
        boolean ok = f.mkdir();

        System.out.println(ok);
    }

 如果我们要在当前目录下创建一个 abc/def/ghi/jkl 文件夹,则可以通过下列代码实现:

    public static void main(String[] args) {
        File f = new File("./abc/def/ghi/jkl");
        boolean ok = f.mkdirs();
        System.out.println(ok);
    }

文件重命名和文件移动

在 Java 中,如果我们想要对文件进行重命名或者进行移动,可以通过 renameTo 方法来实现。

对文件重命名,将 abc 文件名改为 abc1234,具体代码如下:

    public static void main(String[] args) {
        File srcFile = new File("./abc");
        File deskFile = new File("./abc1234");
        boolean ok = srcFile.renameTo(deskFile);
        System.out.println(ok);
    }

如果我们想要移动文件的位置,例如我们想将 abc1234 文件夹下的 def 文件夹移动到当前目录 Java_EE 下,则可以通过以下代码实现,:

    public static void main(String[] args) {
//         对文件进行移动
        File srcFile = new File("./abc1234/def");
        File deskFile = new File("./def");
        boolean ok = srcFile.renameTo(deskFile);
        System.out.println(ok);
    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaFX深度实践:从零构建高级打地鼠游戏(含多物品与反馈机制)

大家好&#xff01;经典的“打地鼠”游戏是许多人童年的回忆&#xff0c;也是学习 GUI 编程一个非常好的切入点。但仅仅是“地鼠出来就打”未免有些单调。今天&#xff0c;我们来点不一样的——用 JavaFX 打造一个高级版的打地鼠游戏&#xff01;在这个版本中&#xff0c;洞里钻…

Python 简介与入门

目录 一、Python 初识 1、Python 的优势 2、Python 的特性 3、Python 的应用领域 二、Linux 环境中安装 Python 1、下载 Python3.11.6 2、安装依赖包 3、解压 Python 压缩包 4、安装 Python 5、编译及安装 6、建立软链接 7、测试 Python3 运行 8、设置国内 pip 更…

理解RAG第六部分:有效的检索优化

在RAG系统中&#xff0c;识别相关上下文的检索器组件的性能与语言模型在生成有效响应方面的性能同样重要&#xff0c;甚至更为重要。因此&#xff0c;一些改进RAG系统的努力将重点放在优化检索过程上。 从检索方面提高RAG系统性能的一些常见方法。通过实施高级检索技术&#x…

实训Day-2 流量分析与安全杂项

目录 实训Day-2-1流量分析实战 实训目的 实训任务1 SYN半链接攻击流量分析 实训任务2 SQL注入攻击流量分析一 实训任务3 SQL注入攻击流量分析二 实训任务4 Web入侵溯源一 实训任务5 Web入侵溯源二 ​编辑 实训Day-2-1安全杂项实战 实训目的 实训任务1 流量分析 FTP…

几种电气绝缘类型

1. 基本绝缘 1.1 绝缘等级 1.2 I类设备 2. 附加绝缘 3. 双重绝缘 4. 加强绝缘 5. 功能性绝缘 1. 基本绝缘 用于防止触及带电部件的初级保护,该防护是由绝缘材料完成的 基本绝缘的目的在于为防电击提供一个基本的保护,以避免触电的危险,不过此类绝缘只能保证正常状态下…

char32_t、char16_t、wchar_t 用于 c++ 语言里存储 unicode 编码的字符,给出它们的具体定义

&#xff08;1&#xff09; #include <iostream> #include <string>int main() { std::u16string s u"C11 引入 char16_t"; // 定义 UTF-16 字符串for (char16_t c : s) // 遍历输出每个 char16_t 的值std::cout << std::hex << (…

Java Set/List 知识点 Java面试 基础面试题

Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复&#xff0c;允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…

Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记

本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3&#xff0c;副标题为&#xff1a;Optimizing Oracle Database resou…

FastAPI WebSocket 聊天应用详细教程

项目简介 这是一个基于 FastAPI 和 WebSocket 实现的实时聊天应用&#xff0c;支持一对一聊天、离线消息存储等功能。 技术栈 后端&#xff1a;FastAPI (Python)前端&#xff1a;HTML、JavaScript、CSS通信&#xff1a;WebSocket认证&#xff1a;简单的 token 认证 项目结构…

vue3+canvas裁剪框样式【前端】

目录 canvas绘制裁剪框&#xff1a;拖拽改变框的大小&#xff1a;圆圈样式&#xff1a;方块样式&#xff1a; canvas绘制裁剪框&#xff1a; // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…

软件功能测试和非功能测试有什么区别和联系?

软件测试是保障软件质量的核心环节&#xff0c;而软件功能测试和非功能测试作为测试领域的两大重要组成部分&#xff0c;承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现&#xff0c;确保软件的功能和业务流程…

10_C++入门案例习题: 结构体案例

案例描述 学校正在做毕设项目&#xff0c;每名老师带领5个学生&#xff0c;总共有3名老师&#xff0c;需求如下 设计学生和老师的结构体&#xff0c;其中在老师的结构体中&#xff0c;有老师姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数&#xff0c; 创建…

快速定位达梦缓存的执行计划并清理

开发告诉你一个sql慢&#xff0c;你想看看缓存中执行计划时&#xff0c;怎么精准快速定位&#xff1f; 可能一般人通过文本内容模糊搜索 select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like %YOUR SQL STRING%; 搜出来的内容比较多&#xff0c;研…

若依、vben-admin、三维可视化

对三维可视化&#xff0c;包括cesium、模型加载、GIS有关的项目和技术都可以私信&#xff0c;包括基础数据后台管理系统的搭建和配置

LLMs可在2位精度下保持高准确率

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

爆改 toxml 组件 支持数据双向绑定 解决数据刷新问题

GGGGGGGGGGGGGGGGGithub地址自行研究 sbfkcel/towxml: 微信小程序HTML、Markdown渲染库https://github.com/sbfkcel/towxml原组件是以导入数据渲染信息为目的、本文以AI数据返回小程序为模拟效果演示 默认情况只在ready 环节进行渲染静态资源 1、对传入数据容器的位置做处理 …

Unreal如何使用后处理材质实现一个黑屏渐变效果

文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…

DB-GPT支持mcp协议配置说明

简介 在 DB-GPT 中使用 MCP&#xff08;Model Context Protocol&#xff09;协议&#xff0c;主要通过配置 MCP 服务器和智能体协作实现外部工具集成与数据交互。 开启mcp服务&#xff0c;这里以网页抓取为例 npx -y supergateway --stdio "uvx mcp-server-fetch" …

CoT-Drive:利用 LLM 和思维链提示实现自动驾驶的高效运动预测

25年3月来自澳门大学和 MIT 的论文“CoT-Drive: Efficient Motion Forecasting for Autonomous Driving with LLMs and Chain-of-Thought Prompting”。 准确的运动预测对于安全的自动驾驶 (AD) 至关重要。本研究提出 CoT-Drive&#xff0c;这是一种利用大语言模型 (LLM) 和思…

Flowable7.x学习笔记(十)分页查询已部署 BPMN XML 流程

前言 上一篇文章我们已经完成了流程的部署功能&#xff0c;那么下一步就是要激活流程了&#xff0c;但是我们要需要明确的指定具体要激活部署后的哪一条流程&#xff0c;所以我们先把已部署的基础信息以及具体定义信息分页查询出来&#xff0c;本文先把基础代码生成以及完成分页…