Java File类

news2024/11/20 20:26:01

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.coloradmin.cn/o/1636390.html

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

相关文章

C语言 | Leetcode C语言题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* rotateRight(struct ListNode* head, int k) {if (k 0 || head NULL || head->next NULL) {return head;}int n 1;struct ListNode* iter head;while (iter->next ! NULL) {iter iter->next;n;}int add n…

c#数据库: 9.删除和添加新字段/数据更新

先把原来数据表的sexy字段删除,然后重新在添加字段sexy,如果添加成功,sexy列的随机内容会更新.原数据表如下: using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; using System.…

3D看车有哪些强大的功能?适合哪些企业使用?

3D看车是一种创新的汽车展示方式&#xff0c;它提供了许多强大的功能&#xff0c;特别适合汽车行业的企业使用。 3D看车可实现哪些功能&#xff1f; 1、细节展示&#xff1a; 51建模网提供全套汽车行业3D数字化解决方案&#xff0c;3D看车能够将汽车展示得更加栩栩如生&…

ClickHouse高原理与实践

ClickHouse高原理与实践 1 ClickHouse的特性1.1. OLAP1.2. 列式存储1.3. 表引擎1.4. 向量化执行1.5. 分区1.6. 副本与分片1.7 其他特性 2. ClickHouse模块设计2.1 Parser分析器与Interpreter解释器2.2 Storage2.3 Column与Field2.4 DataType2.4 Block2.5 Cluster与Replication …

C语言.自定义类型:结构体

自定义类型&#xff1a;结构体 1.结构体类型的声明1.1结构体回顾1.1.1结构体的声明1.1.2结构体变量的创建和初始化 1.2结构体的特殊声明1.3结构体的自引用 2.结构体内存对齐2.1对齐规则2.2为什么存在内存对齐2.3修改默认对齐数 3.结构体传参4.结构体实现位段4.1什么是位段4.2位…

【Linux系统编程】30.pthread_exit、pthread_join、pthread_cancel

目录 pthread_exit 参数retval 测试代码1 测试结果 pthread_join 参数thread 参数retvsl 返回值 测试代码2 测试结果 pthread_cancel 参数thread 返回值 测试代码3 测试结果 pthread_exit 退出当前线程。 man 3 pthread_exit 参数retval 退出值。 NULL&#xf…

我用文心4.0给你做了一个“五一旅行助手”!行程规划、实时查询、景区讲解!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

使用Gradio搭建聊天UI实现质谱AI智能问答

一、调用智谱 AI API 1、获取api_key 智谱AI开放平台网址&#xff1a; https://open.bigmodel.cn/overview 2、安装库pip install zhipuai 3、执行一下代码&#xff0c;调用质谱api进行问答 from zhipuai import ZhipuAIclient ZhipuAI(api_key"xxxxx") # 填写…

Visual studio 2019 编程控制CH341A芯片的USB设备

1、硬件 买了个USB可转IIC、或SPI、或UART的设备&#xff0c;主芯片是CH341A 主要说明USB转SPI的应用&#xff0c;绿色跳线帽选择IIC&SPI&#xff0c;用到CS0、SCK、MOSI、MISO这4个引脚 2、软件 2.1、下载CH341A的驱动 点CH341A官网https://www.wch.cn/downloads/CH34…

OpenCV如何实现背投(58)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较(57) 下一篇&#xff1a;OpenCV如何模板匹配(59) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 OpenCV 函数 cv::calcBackP…

Mac好用又好看的终端iTerm2 + oh-my-zsh

Mac好用又好看的终端iTerm2 1. iTerm2的下载安装2. oh-my-zsh的安装2.1 官网安装方式2.2 国内镜像源安装方式 3. oh-my-zsh配置3.1 存放主题的路径3.2 存放插件的路径3.3 配置文件路径 1. iTerm2的下载安装 官网下载&#xff1a; iTerm2 2. oh-my-zsh的安装 oh-my-zsh是一…

设备能源数据采集新篇章

在当今这个信息化、智能化的时代&#xff0c;设备能源数据的采集已经成为企业高效运营、绿色发展的重要基石。而今天&#xff0c;我们要向大家介绍的就是一款颠覆传统、引领未来的设备能源数据采集神器——HiWoo Box网关&#xff01; 一、HiWoo Box网关&#xff1a;一站式解决…

C++11:shared_ptr循环引用问题

一、shared_ptr的弊端 struct Listnode {int _val;std::shared_ptr<Listnode> _prev;std::shared_ptr<Listnode> _next;Listnode(int val ):_val(val),_prev(nullptr),_next(nullptr){}~Listnode(){cout << "~Listnode()" << endl;} }; in…

探索未来,开启元宇宙之旅!

一、什么是元宇宙 元宇宙&#xff0c;这个词汇逐渐进入了公众的视野&#xff0c;引发了人们无尽的想象。 首先&#xff0c;元宇宙是什么&#xff1f;元宇宙&#xff0c;顾名思义&#xff0c;是一个虚拟现实的世界&#xff0c;一个融合了数字、物理和社交空间的全息图。它不仅…

【数据结构】位图与布隆过滤器

目录 前言 位图的概念 经典面试题目 位图的模拟实现 set() reset() test() 位图整体代码 位图的应用 位图的优缺点 布隆过滤器 布隆过滤器的概念 哈希函数的个数与布隆过滤器长度的关系 布隆过滤器的模拟实现 插入 查找 删除 布隆过滤器整体代码 前言 哈希本质…

nginx缓存清理

背景 昨天打开我的gpt镜像网站&#xff0c;意外发现静态图片资源全都无法获取了 CoCo-AI 一番排查下来&#xff0c;发现是引用的cdn链接失效了 且cdn源是属于七牛云的&#xff0c;且不再维护&#xff0c;于是果断切换到cloudflare export function getEmojiUrl(unified: str…

iBarcoder for Mac:一站式条形码生成软件

在数字化时代&#xff0c;条形码的应用越来越广泛。iBarcoder for Mac作为一款专业的条形码生成软件&#xff0c;为用户提供了一站式的解决方案。无论是零售、出版还是物流等行业&#xff0c;iBarcoder都能轻松应对&#xff0c;助力用户实现高效管理。 iBarcoder for Mac v3.14…

Android4.4真机移植过程笔记(一)

1、RK源码编译 获取内核源码&#xff1a; git clone git172.28.1.172:rk3188_kernel -b xtc_ok1000 内核编译环境&#xff1a; 从172.28.1.132编译服务器的/data1/ZouZhiPing目录下拷贝toolchain.tar.gz&#xff08;交叉编译工具链&#xff09;并解压到与rk3188_kernel同级目…

计算机英文论文常见错误写作习惯2

目录 第一部分 非常长的句子 在一个句子的主要概念的前面&#xff0c;首先说明目的、地点或原因 将表示时间的短语放在句首的倾向 将最重要的主语放在句首&#xff0c;以示强调 ‘In this paper’, ‘in this study’ 第一部分 非常长的句子 由于作者经常直接从中文翻译…

通过ESXi主机和专业工具导出或导入虚拟机

关于导出虚拟机的用户场景 导出ESXi虚拟机是VMware内置功能之一&#xff0c;可用于数据迁移或作为ESXi备份解决方案。通常情况下&#xff0c;您可以将ESXi中的虚拟机导出为OVF模板&#xff0c;该模板可捕获虚拟机或虚拟设备的状态并存储在一个自包含的包中&#xff0c;其中磁盘…