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

目录

📝认识文件

🚩树型结构组织 和 目录

🎈绝对路径和相对路径

🚩文件类型

📝文件系统操作

🎈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类中都得以实现。


多敲代码,多思考。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SCT2A23STER 电源降压转换芯片 1.2A 4.5V-100V

SCT2A23是一种1.2A降压型直流变换器&#xff0c;输入电压范围从4.5V至100V&#xff0c;集成了530mΩ高压侧MOSFET和220mΩ低压侧MOSFET。SCT2A23选用恒导通时刻&#xff08;COT&#xff09;形式控制&#xff0c;支撑PFM形式&#xff0c;具有典型的160uA低静态电流&#xff0c;有…

【C++题解】1329. 求梯形的面积

问题&#xff1a;1329. 求梯形的面积 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 梯形面积的求解公式为S(ab)h/2 。从键盘读入一个梯形的上底 a、下底 b 和高 h &#xff0c;请计算表梯形的面积。&#xff08;结果保留1位小数&#xff09;。&#xff08;5.1.1…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器&#xff0c;GCC编译器除了支持ANSI C&#xff0c;还支持GNU C。在Linux内核中&#xff0c;许多地方都使用了GNU C语言的扩展特性&#xff0c;如typeof、__attribute__、__aligned、__builtin_等&#xff0c;这些都是GNU C语言的特性。 typeof 下面…

C++ vector内存分配及正确释放

C vector内存分配及正确释放_vector 释放-CSDN博客 内存分配 #include <iostream> #include <vector> using namespace std;int main(){ vector<int> vec(10); cout << "vec.size: "<< vec.size() <<endl; cout << &quo…

SpringCloudAlibaba-概述(一)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 记录SpringCloudAlibaba的整合过程 一、简单概述一下项目情况 项目主要有4个模块和4个微服务&#xff1b; 项目结构如下&#xff1a; mall&#xff1a;父工程 -- common&#xff1a;公共组件&#xff0c;存放公用的实…

git常用命令合集,程序员必备技能,5分钟学会

仓库相关操作 1.git remote -v 查看当前仓库地址 2.git remote add origin 仓库地址&#xff1a;给当前git项目添加远程仓库绑定 3.git branch -M main : 重命名当前分支为main 4.git push -u origin main&#xff1a;将当前(main)分支上的内容上传到刚刚添加的origin远程库…

matlab使用教程(40)—二维傅里叶变换和多项式插值

1使用 FFT 进行多项式插值 使用快速傅里叶变换 (FFT) 来估算用于对一组数据进行插值的三角函数多项式的系数。 1.1数学中的 FFT FFT 算法通常与信号处理应用相关&#xff0c;但也可以在数学领域更广泛地用作快速计算工具。例如&#xff0c;通常通过解算简单的线性系统来计算…

JS加密:对比JScrambler和JShaman加密效果

本文&#xff0c;以一个实例&#xff0c;比对JS加密两大神器&#xff1a;JScrambler、JShaman的加密结果&#xff0c;看看谁的加密效果更好。 注&#xff1a;本文不是技术文章&#xff0c;仅仅从加密结果的“型”上简单观查&#xff0c;不做技术分析&#xff0c;仅看哪个加密代…

Windows系统Docker部署IT工具箱It- Tools结合内网穿透实现公网访问

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

AI论文速读 | TF-LLM:基于大语言模型可解释性的交通预测

论文标题&#xff1a; Explainable Traffic Flow Prediction with Large Language Models 作者&#xff1a;Xusen Guo, Qiming Zhang, Mingxing Peng, Meixin Zhu(朱美新)*, Hao (Frank)Yang(杨昊) 机构&#xff1a;香港科技大学&#xff08;广州&#xff09;&#xff0c;约翰…

vue3 + potree 渲染点云数据记录

potree 官网示例 前置条件&#xff1a; potree 无法直接加载 LAS&#xff0c;LCD&#xff0c;PLY等格式的点云文件, 需要通过 PotreeConverte 转换为 octree 数据格式&#xff0c;前端渲染中加载转换后的 json 格式 格式转换方向 .las ---- potreeConverter ----> .json…

【Python】类和对象

类和对象 构造方法封装继承多继承 多态 类&#xff1a; 类是一个模板&#xff0c;描述一类对象的行为和状态。 有了模板我们就可以根据这个模板创建具体的对象。 对象&#xff1a; 对象是类的一个具体实例&#xff0c;有状态和行为。 class 类名称: 类的属性类的行为 # 其中 c…

Python 复杂密码图形化生成工具,支持选择生成10位和12位复杂密码(初版)

代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2024/3/26 15:22 # Author : wyq # File : 部署测试.py import random import string from tkinter import *def generate_password(length):characters string.ascii_letters string.digits string.p…

2006-2021年各省能源消费总量数据(无缺失)

2006-2021年各省能源消费总量数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2006-2021年 2、来源&#xff1a;能源年鉴、各省年鉴 3、范围&#xff1a;30个省 4、指标&#xff1a;能源消费总量&#xff08;万吨标煤&#xff09; 5、缺失情况&#xff1a;无缺失 …

智能网联汽车自动驾驶数据记录系统DSSAD数据元素

目录 第一章 数据元素分级 第二章 数据元素分类 第三章 数据元素基本信息表 表1 车辆及自动驾驶数据记录系统基本信息 表2 车辆状态及动态信息 表3 自动驾驶系统运行信息 表4 行车环境信息 表5 驾驶员操作及状态信息 第一章 数据元素分级 自动驾驶数据记录系统记录的数…

设计模式-组合模式(Composite Pattern)

1. 概念 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树状的层次结构&#xff0c;用来表示“整体-部分”的关系。 2. 原理结构图 原理图 抽象角色&#xff08;Component&#xff09;&#xff1a;这是组合模式的核心&#xff0c;它定义了树叶和树枝构件的公…

跟TED演讲学英文:The inside story of ChatGPT‘s astonishing potential by Greg Brockman

The inside story of ChatGPT’s astonishing potential Link: https://www.ted.com/talks/greg_brockman_the_inside_story_of_chatgpt_s_astonishing_potential Speaker: Greg Brockman Date:April 2023 文章目录 The inside story of ChatGPTs astonishing potentialIntro…

第100+5步 ChatGPT文献复现:ARIMAX预测肺结核 vol. 5

基于WIN10的64位系统演示 一、写在前面 我们继续往下看&#xff0c;首先例行回顾文章&#xff1a; 《PLoS One》杂志的2023年一篇题目为《A comparative study of three models to analyze the impact of air pollutants on the number of pulmonary tuberculosis cases in …

zdpreact_antdesginpro 研究一下react里面比较流行的一个UI框架,开发后台管理系统

首先看一下最开始的代码&#xff1a; 这里面大部分的东西都可以删掉&#xff0c;比如README&#xff0c;只留下中文的那个就可以了。 之后看看README.md中介绍的特性。 特性 &#x1f4a1; TypeScript: 应用程序级 JavaScript 的语言&#x1f4dc; 区块: 通过区块模板快速…

LeetCode 热题 100 题解(二):双指针部分(2)| 滑动窗口部分(1)

题目四&#xff1a;接雨水&#xff08;No. 43&#xff09; 题目链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water/description/?envTypestudy-plan-v2&envIdtop-100-liked 难度&#xff1a;困难 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&am…