【java查漏补缺】File类的使用

news2024/11/19 22:33:25

File类可以用来处理文件数据,比如使用list()方法可以获得某个文件夹下面的所有文件名。

File类的list()方法有一个含有一个参数的重载,在调用该方法的时候需要传入一个FilenameFilter对象,这样便可以进行文件名过滤。

我们先来看一下list()函数的源码

// 没有参数的list()函数
public String[] list() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(path);
    }
    if (isInvalid()) {
        return null;
    }
    return fs.list(this);
}


// 有参数的list()函数
public String[] list(FilenameFilter filter) {
    String names[] = list();
    if ((names == null) || (filter == null)) {
        return names;
    }
    List<String> v = new ArrayList<>();
    for (int i = 0 ; i < names.length ; i++) {
        if (filter.accept(this, names[i])) {
            v.add(names[i]);
        }
    }
    return v.toArray(new String[v.size()]);
}

当我们使用list()函数的时候传入了一个FilenameFilter参数的时候,首先会调用无参的list()函数,获取目录下所有文件名,然后判断一下获取的文件名数组和过滤器对象是否为空,如果两个都为空,那么无参的list()函数得到的结果,否则就回调过滤器的accept()函数进行过滤,符合条件的文件名就存到List<String>容器中,最后将容器中的数据打包成String数组返回。

我们可以继续深入去看FilenameFileter对象,会发现实际上就是一个函数式接口,其源码如下

@FunctionalInterface
public interface FilenameFilter {
    /**
     * Tests if a specified file should be included in a file list.
     *
     * @param   dir    the directory in which the file was found.
     * @param   name   the name of the file.
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise.
     */
    boolean accept(File dir, String name);
}

我们只需要实现accept()方法就行了,在进行文件名过滤的时候会回调accept()方法。

使用上述的api,可以实现对系统文件的一些操作。

  • 文件名过滤器

文件名过滤器主要的功能就是根据输入的参数对某个文件下下的所有文件名进行过滤。

import java.io.File;
import java.io.FilenameFilter;

public class DirList {
    public static void main(String[] args) {
        File path = new File("..");
        String[] list;
        // 如果没有传入额外参数的话就直接获取所有文件
        if(args.length == 0) {
            list = path.list();
        }
        else {
            list = path.list(new DirFileter(args[0]));
        }
        // 将读取的文件逐个打印
        for(int i=0; i<list.length; i++){
            System.out.println(list[i]);
        }
    }
}

class DirFileter implements FilenameFilter{

    String afn;

    DirFileter(String afn){
        this.afn = afn;
    }

    @Override
    public boolean accept(File dir, String name) {
        // 读取文件名,然后判断是否包含指定字符
        String f = new File(name).getName();
        return f.contains(afn);
    }
}

当我们不传入任何参数的时候,就会列出相应目录的所有文件

 我们还可以传入一个参数对文件名进行过滤

 

 

  • 排序目录列表

有的时候,我们需要对文件名按照一定的顺序进行排列输出,这时候就可以将上面的代码进行一定修改

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;

public class SortedDirList {
    private File path;
    private String[] list;
    public SortedDirList(final String afn){
        path = new File("..");
        if(afn == null){
            list = path.list();
        }
        else {
            list = path.list(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    String f = new File(name).getName();
                    return f.contains(afn);
                }
            });
        }
        sort();
    }

    // 打印
    public void print(){
        if(list != null) {
            for (int i = 0; i < list.length; i++) {
                System.out.println(list[i]);
            }
        }
    }

    private void sort(){
        Arrays.sort(list);
    }

    public static void main(String[] args) {
        SortedDirList sd;
        if(args.length == 0){
            sd = new SortedDirList(null);
        }
        else {
            sd = new SortedDirList(args[0]);
        }
        sd.print();
    }

}

上述代码在逻辑上就是在进行文件名过滤后,再添加排序的逻辑,其中排序逻辑都在sort()函数中编写,使用Arrays.sort(list)进行排序的逻辑是,先排大写字母,后排小写字母,并且按照字典顺序排序,程序运行逻辑如下所示

通过在sort()函数中编写不同的逻辑就可以实现不同的排序需求。

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

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

相关文章

GJB 5000B二级-PP项目策划

一、主要变化情况 合并10项(绿色)、修订3项(蓝色)、删除1项(红色) 新增的主要内容 基于A版标准“项目策划”、“集成项目管理”、“定量项目管理”三个过程域中有关项目策划实践的内容来识别,没有新增实践,只增加了以下两个要求: 1、增加软件项目和设备/系统生存周…

Java线程之中断方法

interrupt()方法介绍interrupt() 给目标线程发送一个中断信号&#xff0c;同时将目标线程的中断标志设置为true。至于目标线程是否做出响应&#xff0c;需要看目标线程是否有对应的中断业务逻辑。场景1&#xff1a;假设&#xff0c;你是一个工厂的老板&#xff08;main线程&…

C++类和对象(下)

目录 初始化列表 explicit关键字 Static成员 友元 友元函数 友元类 匿名对象 内部类 初始化列表 初始化列表是以冒号开始&#xff0c;以逗号分割的成员列表&#xff0c;每一个成员变量后面跟一个放在括号中的初始值或表达式。&#xff08;代码演示以日期类为例&#xff…

【实现QQ登录界面 Objective-C语言】

一、实现QQ登录界面 1.实现这样的QQ登录界面 1.实现这样的QQ登录界面 2.首先,分析一下,这个界面里,都有哪些控件 是不是两个Label,两个TextField文本框,1个Button吧 3.先拖1个Label上来 再拖1个TextField文本框上来,在这个Label右边, 然后选中这两个控件, 按住o…

Altium Designer 超详细学习教程——印制电路板基础知识

在介绍Altium Designer软件使用办法之前先介绍下印制电路板的基础知识&#xff0c;不管是画图还是绘制PCB最终目的都是为了制作电路板&#xff0c;因此了解PCB的基础知识很有必要。 1.1印制电路板概述 1.1.1印制电路板结构 在进行PCB设计时&#xff0c;需要先对印制电路板的…

【Linux】对于make/Makefile的使用

本文目录 背景简介 细说关于make命令和makefile文件&#xff1a; 使用方法 为什么执行的指令是make和make clean呢&#xff1f; gcc如何判断文件是否需要重新执行&#xff1f; 背景简介 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&…

064-Tcp/IP通讯使用ServerSocket及Server实现多人在线聊天项目实训

【上一讲】063-Tcp/IP通讯使用ServerSocket及Server实现多人在线聊天_CSDN专家-赖老师(软件之家)的博客-CSDN博客 本文主要讲解使用ServerSocket,Socket类实现多人同时在线聊天的网络通讯程序,主要功能及技术如下: 1.使用ServerSocket,Socket类实现网络通讯功能; 2.使用…

【go语言之websocket】

go语言之websocket写在前面服务端msggetConnUpgradeNewWsConnectionNextWriterwriteread客户端抓包表现总结写在前面 之前的文章都是介绍的是http的使用&#xff0c;这里主要介绍的是websocket,主要是解决长连接场景下的使用。这里概念不多说&#xff0c;网上很多&#xff0c;…

Ajax篇-前后端交互, 接口文档, ajax, axios, fetch,Postman工具

前后端交互接口文档请求方法区分方式GETPOST从语义上区分偏向于查询&#xff08;获取数据....&#xff09;偏向于提交数据(注册,修改,删除...)安全性显示的携带参数,参数是直接拼接在请求地址之后,安全性较差,隐私性差隐式的携带参数,不会在请求地址上显示,安全性好,以JSON格式…

网络虚拟化基本架构

文章目录架构概述架构图核心组件OpenFlow SwitchPipelineFlow Table EntryInstructionOpenFlow Switch Protocol测试验证Pipeline流表项间流程流表间流程Flow Table EntryInstructionsSwitch ProtocolFaucet架构概述 我们知道网络虚拟化的主要目标就是让报文可以在虚拟机之间进…

Windows Anaconda YOLOv3环境部署--2023年1月8日

时效性&#xff1a; 2023年1月8日 目录摘要1 使用 Anaconda 创建虚拟环境2 安装官方要求的依赖库3 验证安装 | 执行 detect.py 示例代码Key already registered with the same priority摘要 网好的可以直接参考官方文档安装&#xff0c;遇到安装报错和网络问题可以参考本文 本地…

网络安全等级保护定级指南 范围

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 网络安全等级保护 为了配合《中华人民共和国网络安全法》的实施&#xff0c;适应云计算、移动互联、物联网、工业控制和大数据等新技术、新应用情况下网络安全等…

Spring Cloud OpenFeign入门示例

简介 Feign Feign是一个声明性web服务客户端。让编写Web服务客户端变得非常容易&#xff0c;只需创建一个接口并在接口上添加注解即可。让http远程调用就像接口调用一样简单。&#xff08;远程http调用的工具有很多&#xff0c;HttpClient、OKHttp、Spring Boot中的RestTempl…

2023新年红包,兔年HTML红包页面代码【2023新年快乐_附源码】

文章目录一.新年红包&#xff0c;兔年HTML红包页面1.1 资源获取和效果预览二.代码讲解&#xff08;Html文件&#xff09;三.Html文件代码展示&#xff08;需要全部源码请到文章开头链接处下载&#xff09;一.新年红包&#xff0c;兔年HTML红包页面 1.1 资源获取和效果预览 1.…

【Nacos】- Mac-M1下Nacos安装及Nacos启动报错“have ‘x86_64’,need ‘arm64e‘”

Nacos安装及Nacos启动报错“have ‘x86_64’,need arm64e”nacos下载启动nacos问题描述解决方案1、下载安装x86架构的jdk2、更换nacos版本&#xff1a;我这是更换为1.4.2的nacos下载 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 根据自己的工具及需要版本…

LINUX 动态库的版本控制

Linux库文件名的描述版本信息library filename lib <libaray name> .so <libarary version information>库版本信息通常使用以下格式&#xff1a;dynamic libarary version information <M>.<m>.<p>其中&#xff0c;M用一位或多位数字表示库…

(九)汇编语言——转义指令的原理

&#xff08;九&#xff09;汇编语言——转移指令的原理 文章目录&#xff08;九&#xff09;汇编语言——转移指令的原理转移指令作用分类转移行为转移距离转移指令操作符offsetjmp指令功能原理段间转移段内转移短转移原理长转移原理位移越界转移地址寄存器内存段内转移段间转…

【Linux基础】Linux中的时区和时间

基本概念 首先介绍Linux中会用到的时间概念&#xff1a; UTC&#xff1a;Universal Time Coordinated&#xff0c;协调世界时&#xff0c;又称世界统一时间&#xff0c;世界标准时间&#xff0c;国际协调时间。它是一个与时区相关的时间&#xff0c;目前将世界时区分为24个。…

【练习】Day04(未完成版)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 数组中的第K个最大元素2. 组合总数III答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 下面代码运行结果是&#xff08; &#xff09; public class Test{public int add(int a…

传统图像特征描述及提取方法

图像特征描述 图像特征是一幅图像区别于另一幅图像的最基本特征&#xff0c;是其可以作为欸标志性的属性。 图像特征分为两大类: 自然特征&#xff1a;图像本身都具有内在的图像特征&#xff08;如图像的大小、颜色、轮廓、边缘、纹理等&#xff09; 人为特征&#xff1a;便于…