【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

news2025/4/27 15:43:32

目录

📝认识文件

🚩树型结构组织 和 目录

🎈绝对路径和相对路径

🚩文件类型

📝文件系统操作

🎈File 概述

🎈File类的使用

1. 绝对路径 vs 相对路径

2. 路径分隔符

3. 静态成员变量

4. 常用构造器

5. 常用方法

5.1 获取功能

5.1.1 getParent()

 5.1.2 getName()

5.1.3 getPath()

5.1.4 getAbsolutePath()和getCanonicalPath()

5.2判断功能

5.2.1 exists()

5.2.2 isDirectory()和isFile()

5.2.3 canRead()和canWrite() 以及isHidden()

 5.3 创建功能

5.3.1  createNewFile()

5.3.2  mkdir()和mkdirs()

5.4 删除功能

5.4.1 delete()

5.4.2 deleteOnExit() 

5.5 查看功能

5.5.1 list() 

5.5.2 listFiles() 

5.6 更改功能 

5.6.1 renameTo()

📝强化练习

🎈 显示文件及文件夹内容

🎈统计文件夹大小


📝认识文件

所谓的"文件"是一个广义的概念,可以代表很多的东西。

操作系统里,会把很多的 硬件设备 和 软件资源 都抽象成 "文件",统一进行管理。

但是大部分情况下,谈到的文件,都是指硬盘的文件。

文件就相当于是针对 "硬盘" 数据的一种抽象。

我们先来认识狭义上的文件 (file) 。针对硬盘这种持久化存储的 I/O 设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。
每个文件都有属于它自己的,不是内容的一些信息。

🚩树型结构组织 和 目录

同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照 层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。 这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder) 或者目录 (directory) 的概念
对于我们很多人来说说“文件”,但是对于程序员来说"目录(Directory)",这才是专业的叫法。
我们所看到的(此电脑)标识其实是目录树的根节点。此电脑下面有CDE盘。总共是500G硬盘。(每个电脑分布的盘是不一样的,有些只有一个C盘,有些只有一个D盘等等)。

将目录点进去,可以看到还包含其他的目录/文件。

这样我们可以使用 目录的 层次结构来描述,文件所在的为止 “路径”。

D:\git\java_repository 形如这样的一个字符串,体现出了当前文件在哪个目录中。可以通过文件路径,来确定当前文件具体所在的位置了。


🎈绝对路径和相对路径

  • 绝对路径:是以C: D: 盘符开头的,这种路径称为"绝对路径"
  • 相对路径:需要先指定一个目录,作为基准目录,从基准目录出发,看看沿着啥样的路线能够找到指定文件,此时涉及到的路径就是“相对路径“,往往是以.(当前目录)或者..(当前目录的上一级)开头的

1》假设当前的基准目录就是  D:\git\乐乐的二号仓库

     .\test.txt   (./表示当前目录)

2》假设当前的基准目录是  D:\git

    .\乐乐的二号仓库\test.txt     (在下一路径的里面)

 3》假设当前的基准目录是 D:\git\乐乐的二号仓库\111

此时的test.txt文本在111目录的上一级:    ..\test.txt    (..\表示上一个路径)
如果是命令行进行操作,基准目录,就是你当前所处的目录。                      
对于IDEA来说,基准目录就是项目目录。                                                                                  D:\git\java_repository\java-repository\JavaEE_Improve\File_test (项目目录就是File_test)


🚩文件类型

从编程的角度看,文件类型,主要就是俩大类
  • 文本(文件中保存的数据,都是字符串,保存的内容都是合法的字符
  • 二进制 (文件中保存的数据,仅仅是二进制数据.不要求保存的内容是 合法的字符

什么是 合法的字符??——字符集/字符编码

utf8有一个大的表格,就列出了什么字符,对应到什么编码

如果你的文件是utf8编码的,此时文件中的每个数据都是合法的utf8编码的字符,就可以认为这个文本是文本文件了。如果存在一些不是utf8合法字符的情况下,就是二进制了。

本身计算机存储的数据都是二进制的

如何判定一个文件是文本还是二进制?

就直接使用记事本,打开这个文件,如果打开之后,乱码,文件就是二进制,否则就是文本。

很多文件都是二进制的,docx,pptx...都属于二进制的。区分文本和二进制,是很重要的!!写代码的时候,文本文件和二进制文件,代码编写的方式是不同的。


上述我们讲述了文件系统利用树形结构来组织文件,以及路径分为绝对路径和相对路径。
文件都是从两方面入手: 文件系统操作和文件内容操作
  • 文件系统操作:比如删除、创建、重命名文件等等

  • 文件内容操作:流对象 (读和写文件)也就是对文件里面的内容增删查改等操作。

📝文件系统操作

本节内容中,我们主要涉及文件的元信息、路径的操作,暂时不涉及关于文件中内容的读写操作。
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不
代表真实存在该文件。

🎈File 概述

  • 1) java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
  • 2)File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
  • 3) 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
  • 4) File对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。

🎈File类的使用

1. 绝对路径 vs 相对路径

(1)绝对路径:是一个固定的路径,从盘符开始
(2)相对路径:是相对于某个位置开始

2. 路径分隔符

pathSeparator就是路径分隔符 D:\project\test  其中\就是pathSeparator

(1) 路径中的每级目录之间用一个路径分隔符隔开。

(2)路径分隔符和系统有关:

  • windowsDOS系统默认使用"\"来表示
  • UNIX和URL使用"/"来表示

我们知道再编程的时候会有转义字符出现  除非用\\才可以。所以我们更喜欢用 /.

(3) Java程序支持跨平台运行,因此路径分隔符要慎用。
为了解决这个隐患,File类提供了一个常量:
public static final String separator:根据操作系统,动态的提供分隔符。

  • windows 相当于 \ 
  • linux/Mac 相当于 /   

利用这个变量可以自动的提供分隔符。而不担心弄错。

   File file=new File("E:/4_4/test.txt");
        System.out.println(file);
        File file1=new File("E:"+File.separator+"4_4"+File.separator+"test.txt");
        System.out.println(file1);
        File file2=new File("E:\\4_4\\test.txt");
        System.out.println(file2);

3. 静态成员变量

4. 常用构造器

一个File对象相当于硬盘上的文件。

在构建对象的时候,就需要把这个文件的路径给指定进来 (使用绝对/相对路径来表示)。


5. 常用方法

5.1 获取功能
5.1.1 getParent()


 5.1.2 getName()

这里的文件名 是 前缀+扩展  test.txt


5.1.3 getPath()
返回 File 对象的文件路径。
  • 这个方法返回的是构造文件对象时使用的路径字符串。
  • 如果文件对象是通过相对路径创建的,则返回的是相对路径字符串。
  • 如果文件对象是通过绝对路径创建的,则返回的是绝对路径字符串。
需要注意的是, getPath()方法不会检查文件是否存在,它只是返回文件对象的路径字符串。
File file1=new File("E:/4_4/test.txt");
System.out.println(file1.getPath());//绝对路径
    File file2=new File("test.txt");
    System.out.println(file2.getPath());//路径字符串
        File file3=new File("4_4/test.txt");
        System.out.println(file3.getPath());//相对路径


5.1.4 getAbsolutePath()和getCanonicalPath()

    public static void main(String[] args) throws IOException {
        File file=new File("e:/test.txt");
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
    }

windowns上的盘符,是不区分大小写的。

上面的不是很能区别,我们用这种 ./格式

  public static void main(String[] args) throws IOException {
        File file=new File("./test.txt");
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
    }

其实绝对路径就是将 相对路径 拼接到 基准目录上。对于IDEA中,基准目录,就是项目所在的目录。我创建的项目是File_test.


5.2判断功能
5.2.1 exists()

判断是否存在文件就可以使用这个方法。


5.2.2 isDirectory()和isFile()


5.2.3 canRead()和canWrite() 以及isHidden()

一般文件系统上都会对文件有权限的限制。(这个事情在Windows上不太明显)很多同学,windows系统里面的用户都是管理员,管理员的权限很大,可以无视文件本身的权限。


 5.3 创建功能

注意事项: 如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。 

5.3.1  createNewFile()

如果文件存在,就打印绝对路径,如果不存在,那么就打印不存在

   public static void main(String[] args) throws IOException {
        File file=new File("e:/test.txt");
        if(file.exists()){
            //如果文件存在,就打印文件不存在
            System.out.println("文件已经存在");
        }else {
            //如果文件不存在,就创建文件  并且打印绝对路径
            file.createNewFile();
            System.out.println(file.getAbsoluteFile());//如果不存在就打印绝对路径
        }
    }

此时e盘就出现了test.txt文件了。


5.3.2  mkdir()和mkdirs()

创建目录mkdir()

   public static void main(String[] args) {
        File file=new File("e:/4_4");
        boolean mkdir=file.mkdir();//如果目录存在就返回true 不存在就返回false
        if(mkdir){
            //如果目录存在 就打印创建成功
            System.out.println("创建成功");
        }
    }


创建多个目录,就需要mkdirs()

  public static void main(String[] args) {
        File file=new File("e:/4_3/111/222");
        boolean mkdirs=file.mkdirs();
        if(mkdirs){
            //如果目录存在,就打印创建成功
            System.out.println("创建成功");
        }
    }

一般都是用mkdirs更好。 


5.4 删除功能
5.4.1 delete()

注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。

  public static void main(String[] args) {
        File file=new File("e:/test.txt");
        boolean delete=file.delete();
        if(delete){
            //如果删除成功
            System.out.println("删除成功");
        }else {
            System.out.println("删除失败");
        }
    }


但是如果删除一个目录,如果里面没有目录和文件的话,那么就删除成功,如果里面有目录和文件的话,那么就删除失败。

我们从上面可以知道,4_3里面有一系列的目录,所以删除失败。而4_4目录中没有目录和文件,所以删除成功


5.4.2 deleteOnExit() 
根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行

    public static void main(String[] args) throws IOException, InterruptedException {
        File file=new File("e:/test.txt");
        file.deleteOnExit();
        Thread.sleep(5000);
        System.out.println("程序结束");
    }

我们创建一个文件,然后我们调用deleteOnExit()方法之后,休眠5s之后,等程序结束后,就删除文件了。


在office或者wps软件中,在编辑一个文件的时候,就会自动产生一个隐藏的文件,会在你关闭文件的时候自动删除掉。

关闭文件后就自动删除了。

因为当word文件修改并且保存后关闭了,说明线程结束了,此时就自动删除临时文件。所以在deleteOnExit()方法的时候,调用之后等待线程结束才结束,这样就防止数据丢失。为了解决你的电脑突然断电,数据来不及保存的问题,这种机制就可以避免这种情况。


5.5 查看功能
String[]
list()返回 File 对象代表的目录下的所有文件名 (文件名)
File[]listFiles()
返回 File 对象代表的目录下的 所有文件 ,以 File 对象
表示 (路径)
5.5.1 list() 

我们在E:\4_4\5_5目录下创建几个文件,我们调用该方法接收。

  public static void main(String[] args) {
        File file=new File("e:/4_4/5_5");
        String[] strings=file.list();
        System.out.println(Arrays.toString(strings));
    }

返回的是文件名。 


5.5.2 listFiles() 
 public static void main(String[] args) {
        File file=new File("e:/4_4/5_5");
        File[] strings=file.listFiles();
        System.out.println(Arrays.toString(strings));
    }

 返回的是路径下的文件。


5.6 更改功能 
5.6.1 renameTo()

如果不存在该文件就返回false。如果存在该文件就返回true。

boolean
renameTo(File
dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操作

e盘下有个test.txt文件。

  public static void main(String[] args) {
        File srcFile=new File("e:/test.txt");//源
        File destFile=new File("e:/test2.txt");//目标
        boolean ret=srcFile.renameTo(destFile);
        System.out.println(ret);
    }

此时的文件名称重命名成test2.txt。


📝强化练习

🎈 显示文件及文件夹内容

 首先我们输入文件夹路径,首先我们先打印名称,然后继续往后遍历,列出当前目录下的文件或者目录,然后就进入下一个路径了,所以此时我们要用一个count来用于美观的打印出文件的路径,否则都打印成一列看不出来路径的关系,然后我们就依次遍历该路径下的文件或者目录,先\t,然后哦判断是否是文件,如果是文件那么就打印名字,如果不是文件,那么就是文件夹,文件夹就进行递归,按照这样的思路打印即可。

    public static void main(String[] args) {
        System.out.println("请输入一个文件夹路径:");
        Scanner scanner=new Scanner(System.in);
        String s=scanner.next();
        File file=new File(s);
        int count=0;
        showDir(file,count);
    }
    public static  void showDir(File file,int count){
        System.out.println("|-"+file.getName());//得到当前的纯文件名称
        File[] files=file.listFiles();//列出目录下所有的文件
        count++;//每次列出当前目录下的文件都count++
        for (File file1:files) {
            printTab(count);//先tab再打印
            if(file1.isFile()){
                System.out.println("|-"+file1.getName());//如果是文件那么就打印
            }else{
                //如果不是文件,那么就是目录,那么就继续遍历
                showDir(file1,count);
            }
        }
    }
    public  static void printTab(int count){
        for (int i = 0; i <count ; i++) {
            System.out.print("\t");//美观要求 
        }
    }

🎈统计文件夹大小


file.length() 方法用于获取文件的大小,返回的是以字节为单位的文件大小。在Java中,File类的length()方法返回一个long类型的值,表示文件的大小。这个方法可以用于检查文件的大小,以便进行各种操作,比如文件传输、文件拷贝等。

还是以这个目录为例,计算文件夹大小,我们输入文件夹路径,然后传入当参数,文件夹的大小返回值是long类型,然后我们列出当前文件列表,如果是文件夹,那么就继续递归操作,如果不是文件夹,那么就就更新文件夹大小,直到递归完成。

    public static void main(String[] args) {
        System.out.println("请输入文件夹路径");
        Scanner scanner=new Scanner(System.in);
        String s=scanner.next();
        File file=new File(s);
        long size=calculateDirSize(file);//文件夹大小返回值是long
        System.out.println(size);
    }

    public static long calculateDirSize(File file){
        int size=0;
        File[] files=file.listFiles();
        for (File file1:files) {
            if(file1.isDirectory()){
                //如果是文件夹 那么就继续递归操作
                size+=calculateDirSize(file1);
            }else {
                //如果不是文件夹了,那么就加上当前的文件夹的大小即可
                size+=file1.length();
            }
        }
        return size;
    }

和上述的文件大小一模一样。


java.io包中File类里面有很多的方法,底层实现。文件系统操作涉及到的和windows下的删除创建复制剪切等操作都是在java代码中File类中都得以实现。


多敲代码,多思考。

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

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

相关文章

小明记账簿-记账工具

今天不了技术&#xff0c;聊一下工具&#xff0c;最近耗费无数个日日夜夜&#xff0c;做了一个记账小程序&#xff0c;感觉很实用&#xff0c;简单方便&#xff0c;希望帮助那些需要帮助的人。 想轻松管理个人财务吗&#xff1f;试试小明记账簿吧&#xff01;它是一款便捷&…

篮桥杯刷题第n天(dp更新)

最长上升子序列 输入&#xff1a; 10 1 4 5 1 4 1 9 1 9 输出&#xff1a; 4 算法思想&#xff1a;记录每个数为结尾的最长子序列长度&#xff0c;作为dp数组。 eg&#xff1a;&#xff08;这个是以每个位置开头的记录最长的来穷举但核心仍为上述的算法思想&#xff09; …

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构&#xff1a;综合指南 前言一、什么是 Kubernetes 架构&#xff1f;1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 &#xff08;CCM&#xff09; 三…

【HarmonyOS】ArkUI - 动画

利用属性动画、显示动画、组件转场动画实现组件动画效果。 一、属性动画 属性动画是通过设置组件的 animation 属性来给组件添加动画&#xff0c;当组件的 width、height、Opacity、backgroundColor、scale、rotate、translate 等属性变更时&#xff0c;可以实现渐变过渡效果。…

有人用GPT来做日内交易,居然赚钱了!但是……

在我们还在烦恼会不会被AI替代时&#xff0c;已经有人在教ChatGPT去炒股票了。 在近年ChatGPT火速出圈后&#xff0c;围绕AI能取代什么职业的讨论持续受到大众关注。 从事客服、编程、法律合规以及内容创作等行业人员最早感受到这股AI带来的寒意。 那ChatGPT能不能替代交易员…

Web APIs简介 Dom

JS的组成 API API 是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节 简单理解&#xff1a;API是给程序员提供的一种工具&#xff0c;以便能更轻松的实现…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法&#xff1a;将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突&#xff1a;不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突&#xff1a; 1. 开放寻址&#xff1a;产生哈希冲突后&…

刷题之Leetcode704题(超级详细)

704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&am…

【Apache Doris】周FAQ集锦:第 1 期

【Apache Doris】周FAQ集锦&#xff1a;第 1 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

【Java设计模式】序:设计模式总体概述

目录 什么是设计模式设计模式的分类1 创建型模式1.1. 单例&#xff08;Singleton&#xff09;1.2 原型&#xff08;Prototype&#xff09;1.3 工厂方法&#xff08;FactoryMethod&#xff09;1.4 抽象工厂&#xff08;AbstractFactory&#xff09;1.5 建造者&#xff08;Builde…

<网络安全>《71 微课堂<常见的国家级APT组织介绍>》

1 简介 国家级APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&#xff09;组织是有国家背景支持的顶尖黑客团伙&#xff0c;专注于针对特定目标进行长期的持续性网络攻击。 2 十大APT 2.1 NSA 美国国家安全局&#xff08;National Security Agency&a…

Redis面试题28道

1、什么是类加载器&#xff0c;类加载器有哪些&#xff1f; 1、什么是类加载器&#xff1f; 类加载器负责加载所有的类&#xff0c;其为所有被载入内存的类生成一个 java.lang.Class 实例对象。 2、类加载器有哪些&#xff1f; JVM 有三种类加载器&#xff1a; &#xff08…

基于GaN的半导体光学放大器SOA

摘要 基于GaN的材料可覆盖很宽的光谱范围&#xff0c;以紫外、紫、蓝、绿和红波发射的激光二极管已经商业化。基于GaN的半导体光学放大器&#xff08;SOA&#xff09;具有提高激光二极管输出功率的能力&#xff0c;因此SOA将有很多潜在应用。未来需要利用短波、超快脉冲特性的…

GD32F470_ADS1115 超小型 16位 模数转换器 ADC 4通道模块移植

2.9 ADS1115多路模数转换器 ADS1115 器件是兼容 IIC 的 16 位高精度低功耗模数转换器 (ADC)&#xff0c;采用超小型无引线 X2QFN-10 封装和 VSSOP-10 封装。ADS111x 器件采用了低漂移电压基准和振荡器。ADS1114 和 ADS1115 还采用可编程增益放大器(PGA)和数字比较器。这些特性加…

kali报错Unable to connect to remote host: No route to host,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

《搜广推算法指南》(2024版) 重磅发布!

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 结合…

全自动封箱机的工作原理:科技与效率的完美结合

随着科技的不断发展&#xff0c;越来越多的自动化设备走进了我们的日常生活和工业生产中。其中&#xff0c;全自动封箱机作为物流包装领域的重要一环&#xff0c;凭借其高效、精准的工作性能&#xff0c;正逐渐成为提升生产效率、降低劳动成本的得力助手。星派就来与大家深入探…

python调用java中的jar

一、基于IDEA生成可执行jar包 1、编写class的代码&#xff0c;注意一定要有main()方法才可以生成jar包&#xff0c;main()方法可以没有内容。例如下Java 代码&#xff1a; package Project;public class Demo {public static void main(String[] args){Demo t2 new Demo();S…

HarmonyOS(鸿蒙)——单击事件

2.4 实现ClickedListener接口并重写onClick方法 2.5 实现onClick方法中的具体逻辑&#xff0c;以此完成点击事件的相关业务操作 三、测试 3.1 登录远程模拟器 3.2 运行项目 四、精选好文 一、简介 1.1 什么是组件 组件就是文本、按钮、图片等元素的统称 1.2 什么是事件 …