【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 不存在就返回falseif(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);//文件夹大小返回值是longSystem.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.mzph.cn/news/792226.shtml

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

相关文章

【C语言】翻译环境与运行环境

一、前言 在我们学习C语言的时候&#xff0c;第一个接触的程序就是&#xff1a;在屏幕上打印” hello word! “&#xff0c;可当时的我们却未去深入的理解与感悟&#xff0c;一个程序代码是如何运行的&#xff1b;而这一期的博客&#xff0c;则是带着我们&#xff0c;通过C代码…

mac电脑安装redis教程

1、下载地址 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/#redis-downloads 2、安装 2.1 解压下载后的压缩文件 2.2 进入…

Vulnhub:WESTWILD: 1.1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap enm4ulinux sumbclient get flag1 ssh登录 提权 横向移动 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 0…

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;递归判断解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖…

linux操作系统的进程状态

这个博客只是为了自己复习用的&#xff01;&#xff01;&#xff01; 冯诺依曼体系结构 计算机是由一个一个硬件组成的 输入设备&#xff1a;键盘&#xff0c;鼠标&#xff0c;扫描仪&#xff0c;写板等等 中央处理器&#xff08;CPU&#xff09;:含有运算器和控制器等 输出单…

【算法练习】27:冒泡排序学习笔记

一、冒泡排序的算法思想 原理&#xff1a;以升序为例&#xff0c;冒泡排序通过从左往右连续比较相邻元素&#xff0c;当发现左边比右边大就交换元素。从左往右依次比较完称为“一轮”&#xff0c;每轮结束之后就会固定一个元素。 时间复杂度&#xff1a;2层循环&#xff0c;所以…

不讲概念,讲实操,mysql 分表模糊查询、分页查询 及 merge 表的使用

1.Mysql merge合并表的要求 1.合并的分表必须是 MyISAM 引擎&#xff0c;MyISAN引擎是不支持事务的。2.Merge表只保证合表后数据唯一性&#xff0c;合表前的数据可能会存在重复。3.表的结构必须一致&#xff0c;包括索引、字段类型、引擎和字符集。4.删除 tb_member1 分表正确…

Python实现BOA蝴蝶优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

[技术闲聊]我对电路设计的理解(三)

终于可以独立做项目了&#xff0c;是不是很激动&#xff0c;是不是为自己骄傲和自豪&#xff0c;应该的&#xff0c;奋斗那么久不就是为了站在山巅看看四周的风景嘛&#xff01; 虽说山外还有山&#xff0c;但是此刻就在脚下的山巅上&#xff0c;怡然自得都是不过分的&#xff…

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

引言 简介 编译Android可用的模型 转换权重 生成配置文件 模型编译 编译apk 修改配置文件 绑定android library 配置gradle 编译apk 手机上运行 安装 APK 植入模型 效果实测 0. 引言 清明时节雨纷纷&#xff0c;路上行人欲断魂。 小伙伴们好&#xff0c;我是《小…

9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)

例题——最长公共子序列(一) 分析 设最长公共子序列 d p [ i ] [ j ] dp[i][j] dp[i][j]是 S 1 S_1 S1​的前 i i i个元素&#xff0c;是 S 2 S_2 S2​的前 j j j个元素&#xff0c;那么有&#xff1a; 若 S 1 [ i − 1 ] S 2 [ i − 1 ] S_1[i-1]S_2[i-1] S1​[i−1]S2​[…

leetcode刷题-代码训练营-第7章-回溯算法1

回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理结果} }理解 从…

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

Linux是什么,该如何学习

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…

Golang 内存管理和垃圾回收底层原理(一)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收&#xff0c;主要注重基本底层原理讲解&#xff0c;进一步实战待后续文章 1、这篇我们来讨论一下Golang的内存管理 先上结构图 从图我们来讲Golang的基本内存结构&#xff0c;内存结构可以分为&#xff1a;协程缓存、中央缓存…

Excel 粘贴回筛选后的单元格不能完全粘老是少数据 ,有些单元格还是空的

环境&#xff1a; excel2021 Win10专业版 问题描述&#xff1a; excel 粘贴回筛选后的单元格不能完全粘老是少数据 有些单元格还是空的 复制选择筛选后A1-A10单元格 &#xff0c;定位条件&#xff09;&#xff08;仅可见单元格&#xff09;来访问&#xff0c;或者你可以使用…

mybatis-plus 表字段存在关键字的处理办法

一、问题复现 当数据库表中字段出现关键字时&#xff0c;若不做其他处理&#xff0c;mybatis-plus的BaseMapper并不会做其他的处理&#xff0c;最终导致SQL执行时&#xff0c;抛出SQL 语法错误。示例如下&#xff1a; Java查询语句 QueryWrapper<User> userQuery new …

Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析&#xff1a;Pod详解 1、什么是Pod&#xff1f;2、Pod 的组成3、Pod 如何管理多个容器4、Pod 的网络5、Pod 的存储方式6、Pod 的工作方式6.1 自主式 Pod6.2 监控和管理 Pod6.3 Pod 的创建流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

解锁动态规划:从斐波那契到高效算法

动态规划&#xff08;Dynamic Programming, DP&#xff09;是解决优化问题的一种算法策略&#xff0c;它将一个复杂问题分解为更小的子问题&#xff0c;通过解决子问题来逐步找到复杂问题的最优解。动态规划适用于有重叠子问题和最优子结构性质的问题。接下来&#xff0c;我们通…

基于SSM的药店药品商城管理系统

介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,订单管理,客户管理,药品管理,类目管理等功能。用户角色包含以下功能&#xff1a; 用户首…