Java File类

1. File类概述

1.1 什么是File类

        File是java.io包下作为文件和目录的类。File类定义了一些与平台无关的方法来操作文件,通过调用File类中的方法可以得到文件和目录的描述信息,包括名称、所在路径、读写性和长度等,还可以对文件和目录进行新建、删除及重命名等操作。

        对于目录,Java把File类当作一种特殊类型的文件,即文件名单列表。但是File类不能读取文件内容,操作文件内容需要使用输入流和输出流。

1.2 构建 File 对象

        File 的构造方法如下:

 File(String pathname)

        通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。

        其中,路径可以是相对路径或者绝对路径。抽象路径应尽量使用相对路径,并且目录的层级分隔符不要直接写”/”或”\”,应使用File.separator 这个常量表示,以避免不同系统带来的差异。代码示意如下所示:

1.3 绝对路径和相对路径

        绝对路径是指:无论当前工作目录如何,始终指向文件系统中的相同位置的路径。路径以盘符或/开头。

        相对路径是指从某个给定的工作目录开始到目标位置的路径,路径不能以盘符或/开头。

        比如查看如下示意:

        对于文件 demo.txt,其绝对路径是固定的;但是如果当前工作目录不同,其相对路径的写法也不同。

1.4 使用 File 类示例

        首先,创建案例访问的目标文件。在src目录下新建api_03包,在该包下新建一个demo.txt文件,并在该文件中编写任意文字并保存。然后构建 File 对象访问该文件,输出文件的各项信息。

        代码示意如下:

package api_03;import java.io.File;public class FileDemo1 {public static void main(String[] args) {/** File创建时需要指定路径* 路径通常用相对路径,因为绝对路径无法做到* 平台无关性(window与linux的路径写法不同)** 相对路径中"./"为当前目录,具体是哪里要看* 当前程序的运行环境而定,在IDEA中运行* 时,指的就是当前程序所在的项目目录*/File file = new File("./src/api_03/demo.txt");//获取名字String name = file.getName();System.out.println(name);//获取长度(单位是字节)long length = file.length();System.out.println(length+"字节");boolean cr = file.canRead();boolean cw = file.canWrite();System.out.println("可读:"+cr);System.out.println("可写:"+cw);boolean ih = file.isHidden();System.out.println("隐藏文件:"+ih);}
}

2. File类常用操作

2.1 File 操作文件

        File的常用方法有:

        1、length() 方法

  • 返回由此抽象路径名表示的文件的长度(占用的字节量)
  • 返回 long 类型的数值

        2、exists() 方法

  • 测试此抽象路径名表示的文件或目录是否存在
  • 返回值:若该File表示的文件或目录存在则返回true,否则返回false

        3、createNewFile() 方法

  • 当且仅当不存在具有此抽象路径名指定的名称的文件时,创建由此抽象路径名指定的一个新的空文件
  • 返回值:如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false

        4、delete() 方法:删除此抽象路径名表示的文件或目录

  • 返回值:当且仅当成功删除文件或目录时,返回 true;否则返回 false
  • 需要注意的是,若此File对象所表示的是一个目录时,在删除时需要保证此为空目录才可以成功删除(目录中不能含有任何子项)

2.2 创建新文件示例

        编写代码,使用File对象创建新文件。代码示意如下:

package api_03;import java.io.File;
import java.io.IOException;
public class FileDemo2 {public static void main(String[] args) throws IOException {/** 在当前目录下新建文件:test.txt*/File file = new File("./src/api_03/test.txt");/** boolean exists()* 判断当前File表示的路径下是否已经存在* 对应的文件或目录*/if(!file.exists()) {file.createNewFile();System.out.println("文件已创建!");}else {System.out.println("文件已存在!");}}
}

2.3 删除文件示例

        编写代码,使用File对象删除文件。代码示意如下:

package api_03;import java.io.File;
public class FileDemo3 {public static void main(String[] args) {/** 将当前目录下的test.txt文件删除*/File file = new File("./src/api_03/test.txt");if(file.exists()) {file.delete();System.out.println("文件已删除!");}else {System.out.println("文件不存在!");}}
}

2.4 File 创建目录

        File创建目录时,常用方法有:

        1、isDirectory() 方法:判断当前File表示的是否为一个目录,返回 boolean 类型

        2、mkdir() 方法:

  • 创建此抽象路径名指定的目录
  • 当且仅当已创建目录时,返回 true;否则返回 false

        3、mkdirs() 方法:

  • 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
  • 当且仅当已创建目录以及所有必需的父目录时,返回 true;否则返回 false
  • 注意:此操作失败时也可能已经成功地创建了一部分必需的父目录

        编写代码,使用File对象创建目录。代码示意如下:

package api_03;import java.io.File;public class FileDemo4 {public static void main(String[] args) {/** 当前目录下新建一个demo目录*/File dir = new File("./src/api_03/demo");if(!dir.exists()) {dir.mkdir();System.out.println("目录已创建!");}else {System.out.println("目录已存在!");}/** 当前目录下新建多级目录* d1/d2/d3*/File dir2 = new File("./src/api_03/d1/d2/d3");if(!dir2.exists()) {/** 该方法会将所有不存在的父目录一同* 创建出来.而mkdir方法若父目录不存在* 则创建失败.*/dir2.mkdirs();System.out.println("多级目录已创建!");}else {System.out.println("多级目录已存在!");}}
}

2.5 File 删除目录

        File删除目录时,使用delete() 方法:删除此抽象路径名表示的文件或目录。当且仅当成功删除文件或目录时,返回 true;否则返回 false

        需要注意的是,若此File对象所表示的是一个目录时,在删除时需要保证此为空目录才可以成功删除(目录中不能含有任何子项)。

        编写代码,使用File对象删除空目录。代码示意如下:

package api_03;import java.io.File;
public class FileDemo5 {public static void main(String[] args) {File dir = new File("./src/api_03/d1/d2/d3");if(dir.exists()) {/** delete方法删除目录时要求目录* 必须是空目录,否则不删除* true-删除成功 false-其他*/boolean flag = dir.delete();if (flag){System.out.println("目录已删除!");}else{System.out.println("删除失败!");}}else {System.out.println("目录不存在!");}}
}

2.6 获取目录的所有子项

        当目录含有子目录时,可以使用listFiles() 方法:返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的子项(文件或目录)。

        返回类型为 File[ ],即抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。

  • 如果目录为空,那么数组也将为空
  • 如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null

        编写代码,获取当前目录下的所有子项,并打印输出信息。代码示意如下:

public class FileDemo6 {public static void main(String[] args) {File dir = new File("./src/api_03");/** boolean isFile()* 判断当前File表示的是否为文件** boolean isDirectory()* 判断当前File表示的是否为目录*/if(dir.isDirectory()) {/** File[] listFiles()* 获取当前目录下的所有子项,以一个File数组* 形式返回,每个元素表示其中一个子项*/File[] subs = dir.listFiles();System.out.println(subs.length);for(int i=0;i<subs.length;i++) {System.out.println(subs[i].getName());}}}
}

2.7 求文件夹大小问题

        在使用电脑管理文件时,我们经常会查看一个文件夹的大小。文件夹的大小,等于该文件夹各级文件夹中所有文件的大小总和。

        假设有文件夹1如下图所示:

        此时,文件夹1的总大小为:文件1的大小+文件夹2的大小;文件夹2又等于文件2+文件3;所以总和为 23KB。

        这是在确定已知文件夹1只有如图所示的下级内容时。如果不确定文件夹1下有多少级目录,也不确定每个目中有多少个文件,如何来统计呢?

        这适用于用递归的思路来解决。

        假设有方法 getFile(File file),用于计算文件 file 的大小:

  • 如果传入的 file 是文件,则直接获取并返回该文件的大小
  • 如果传入的 file 是文件夹,则遍历该文件夹下的每一个子目录,并对每个子目录调用 getFile() 方法,并且把子目录作为参数传入,并对获取到的文件大小求和

        逻辑过程如下图所示:

        递归的过程如下图所示:

        由此可见,使用递归可以解决经典的求文件夹大小的问题。

        但是,在使用递归时,必须注意:

        1、递归次数尽量少,因为递归的开销较大,效率较差

        2、递归操作必须被一个分支语句控制,有条件的执行,否则会出现死循环,并最终造成内存溢出

        编写代码,获取文件夹的大小,并打印输出信息。代码示意如下:

package api_03;import java.io.File;/*** 递归示例* 求api_03文件夹的大小*/
public class RecursionDemo {public static void main(String[] args) {File file = new File("./src/api_03");long sum = getSize(file);System.out.println("size = " + sum+" bytes");}public static long getSize(File file){if (file.isFile()){return file.length();}else{File[] files = file.listFiles();long sum = 0;for(int i = 0; i < files.length; i++){sum += getSize(files[i]);}return sum;}}
}

2.8 FileFilter接口

        FileFilter 是用于抽象路径名的过滤器,此接口的实例可传递给 File 类的 listFiles(FileFilter) 方法,用于返回满足该过滤器要求的子项。使用方式如下所示:

File[] listFiles(FileFilter  filter)

        返回符合要求的 File 对象数组。

        编写代码,统计某目录下所有以F开头的文件个数及名称,并打印输出信息。代码示意如下:

package api_03;import java.io.File;
import java.io.FileFilter;/*** 统计api_03目录下所有以F开头的文件个数及名称*/
public class FileDemo7 {public static void main(String[] args) {File dir = new File("./src/api_03");if(dir.isDirectory()) {FileFilter filter = new FileFilter() {public boolean accept(File file) {String name = file.getName();System.out.println("正在过滤:"+name);return name.startsWith("F");}};File[] subs = dir.listFiles(filter);System.out.println(subs.length);for(int i=0;i<subs.length;i++) {System.out.println(subs[i].getName());}}}
}

3. 总结

        1、File 是java.io包下作为文件和目录的类

  • 通过调用 File 类中的方法可以得到文件和目录的描述信息
  • 还可以对文件和目录进行新建、删除及重命名等操作

        2、路径

  • 绝对路径是指无论当前工作目录如何,始终指向文件系统中的相同位置的路径
  • 相对路径是指从某个给定的工作目录开始到目标位置的路径

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

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

相关文章

从Paint 3D入门glTF

Paint 3D Microsoft Paint 3D是微软的一款图像编辑软件&#xff0c;它是传统的Microsoft Paint程序的升级版。 这个新版本的Paint专注于三维设计和创作&#xff0c;使用户可以使用简单的工具创建和编辑三维模型。 Microsoft Paint 3D具有直观的界面和易于使用的工具&#xff0…

GitLab常用指令!(工作中常用的)

目录 克隆代码创建分支切换分支将代码提交到分支当中Merge合并 克隆代码 复制完地址&#xff0c;打开Git Bash&#xff0c;然后 git clone “复制的地址”创建分支 创建new_test分支 git branch new_test切换分支 切换到new_test分支 git checkout new_test将代码提交到分…

Hotcoin Research | 市场洞察:2024年4月22日-28日

加密货币市场表现 本周内加密大盘整体呈现出复苏状态&#xff0c;在BTC减半后进入到震荡上行周期。BTC在$62000-66000徘徊&#xff0c;ETH在$3100-3300徘徊&#xff0c;随着港交所将于 4 月 30 日开始交易嘉实基金的比特币和以太坊现货 ETF&#xff0c;周末行情有一波小的拉升…

vue+elementUI实现点击左右箭头切换按钮功能

原本是可以用el-tabs做的,就像下面的样式,但是领导说不行 最后用button和element里面的el-carousel(走马灯)结合了一下 长这样 感觉还不错 可以自己改样式 代码如下: <div class"drawer-carousel"><el-carousel arrow"always" :loop"false…

Qt5配置Opencv读取一张图像

1、首先Qt5配置Opencv(我已经配置成功)有时间发出来 2、Opencv的基本Mat操作 &#xff08;1&#xff09;加Opencv的头文件 #include<opencv2/opencv.hpp> #include <opencv2/highgui/highgui_c.h> using namespace cv;&#xff08;2&#xff09;Opencv图像基本处理…

idea git commit全局ignore配置

idea 全局ignore配置 在开发时&#xff0c;提交开发代码到git&#xff0c;需要剔除一些不需要提交的文件。那么可以配置一个全局ignore文件。 配置方法 新建一个git.ignore文件&#xff0c;将配置写好。 # DIY target/# svn .svn/ # Linux System *~# KDE directory prefer…

自动驾驶框架 UniAD环境部署

感谢大佬们的开源工作 UniAD-github地址-YYDS更多bev算法部署参考如果您觉得本帖对您有帮助&#xff0c;感谢您一键三连支持一波^_^ 统一自动驾驶框架 (UniAD) &#xff0c;第一个将全栈驾驶任务整合到一个深度神经网络中的框架&#xff0c;并可以发挥每个子任务以及各个模块的…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局&#xff08;NASA&#xff09;的可见红外成像辐射计套件&#xff08;VIIRS&#xff09;标准三级&#xff08;L3&#xff09;每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

开通Jetbrains个人账号,赠送这些付费插件

开通Jetbrains个人账号&#xff0c;或者Jetbrains现成账号的, 可赠送以下付费插件 现成账号&#xff1a;https://web.52shizhan.cn/activity/xqt8ly 个人账号&#xff1a;https://web.52shizhan.cn/legal 账号支持全家桶系列&#xff1a;AppCode,CLion,DataGrip,GoLand,Intell…

移动端适配方案

移动端适配 方案 1&#xff1a;rem html font-size 方案 2&#xff1a;vw rem html font-size rem 是相对于 html 元素的 font-size 来设置的单位&#xff0c;通过在不同屏幕尺寸下动态修改 html 元素的 font-size 可达到适配效果 在开发中&#xff0c;我们只需要考虑两个…

IDEA->EasyCode(mapper.xml) 字段无逗号分割问题

IDEA-&#xff1e;EasyCode(mapper.xml) 字段无逗号分割问题_easycode allsqlcolumn 没有逗号-CSDN博客 在easycode的设置里找到&#xff1a; 1、Template下的 mapper.xml.vm脚本 2、Global Config下的 mybatisSupport.vm脚本 然后将这两个脚本里的 $velocityHasNext 替换成 …

WebAuthn 无密码身份认证

文章目录 WebAuthn简介工作原理组成部分架构实现注册认证应用场景案例演示 WebAuthn简介 WebAuthn&#xff0c;全称 Web Authentication&#xff0c;是由 FIDO 联盟&#xff08;Fast IDentity Online Alliance&#xff09;和 W3C&#xff08;World Wide Web Consortium&#x…

java技术栈快速复习05_基础运维(linux,git)

Linux知识总览 linux可以简单的理解成和window一样的操作系统。 Linux和Windows区别 Linux是严格区分大小写的&#xff1b;Linux中一切皆是文件&#xff1b;Linux中文件是没有后缀的&#xff0c;但是他有一些约定俗成的后缀&#xff1b;Windows下的软件一般是无法直接运行的Li…

如何安全可控的进行跨区域数据交换,提高数据价值?

跨区域数据交换指的是在不同地理位置或不同网络环境下的数据传输和共享。随着数字化转型的加速&#xff0c;企业及组织越来越依赖于数据的流动来优化业务流程、增强决策制定和推动创新。然而&#xff0c;跨区域数据交换也带来了一系列的挑战和风险&#xff0c;主要包括&#xf…

3款超好用的PDF在线处理神器,学会了职场工作效率翻倍!

&#x1f60a; 作为一名职场小白,我深知处理文档的痛苦。尤其是面对PDF这个"大魔王",经常感到头大! 合同要合并、简历要压缩、论文要转Word改格式…一个个来手动操作,简直要累死。&#x1f62b; 直到我发现了这些PDF在线处理神器!瞬间感觉自己的工作效率嗖嗖提升,整…

websocket集成文档

1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>2.添加配置 Configuration public class WebSocketConfig {Beanpublic ServerEndpointExpo…

CSS三个标题及对应内容的tab切换

要实现CSS三个标题及对应内容的tab切换&#xff0c;你可以使用纯HTML和CSS来完成。这里有一个简单的示例&#xff0c;展示了如何创建三个标题及其对应内容的tab切换效果&#xff1a; HTML部分&#xff1a; html <div class"tabs"> <div class"tab&q…

【STM32】F405/407的模块总览图,记录查看

从STM32F405/407数据手册中提取&#xff0c;方便以后查看。主要是什么外设连接在什么总线上&#xff0c;时钟频率是多少。 TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大频率84M TIM1、8、9、10、11在APB2上&#xff0c;最大频率168M

3.9设计模式——Strategy 策略模式(行为型)

意图 定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化 结构 Strategy&#xff08;策略&#xff09;定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方…

从源头上减少BUG:掌握Java中的label和assert语句!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…