File类—递归文件搜索执行脚本文件

news2024/11/26 18:32:15

文章目录

    • 一、需求分析
    • 二、File类
      • 2.1 File对象的创建
      • 2.2 File判断和获取方法
      • 2.3 创建和删除方法
      • 2.4 遍历文件夹方法
    • 三、Runtime类—常见api
    • 四、递归文件搜索执行脚本文件

一、需求分析

在本篇博客中,我们想通过递归文件的方式,在D:\\判断下搜索QQ.exe这个文件,然后直接输出,并执行该脚本文件。(当然具体在哪个目录下寻找哪个文件完全可以根据具体的需求来决定)
为了实现该需求,我们需要了解File类和Runtime类的基本使用,下面会一一介绍,最后会给出最终的代码实现!

二、File类

文件时非常重要的存储方式,在计算机硬盘中。即便断电或者程序终止了,存储在硬盘文件中的数据也不会丢失!File类用来表示当前系统下的文件(也可以是文件夹),通过File类提供的方法可以获取文件大小、判断文件是否存在、创建文件、创建文件夹等。
**但是需要我们注意:File对象只能对文件进行操作,不能操作文件中的内容

2.1 File对象的创建

学习File类和其他类一样,第一步是创建File类的对象。 想要创建对象,我们得看File类有哪些构造方法。
在这里插入图片描述

需求我们注意的是:路径中"“要写成”\“, 路径中”/"可以直接用

public class FileTest1 {
    public static void main(String[] args) {
        // 1、创建一个File对象,指代某个具体的文件。
        // 路径分隔符
        // File f1 = new File("D:/resource/ab.txt");
        // File f1 = new File("D:\\resource\\ab.txt");
        File f1 = new File("D:" + File.separator +"resource" + File.separator + "ab.txt");
        System.out.println(f1.length()); // 文件大小

        File f2 = new File("D:/resource");
        System.out.println(f2.length());

        // 注意:File对象可以指代一个不存在的文件路径
        File f3 = new File("D:/resource/aaaa.txt");
        System.out.println(f3.length());
        System.out.println(f3.exists()); // false

        // 我现在要定位的文件是在模块中,应该怎么定位呢?
        // 绝对路径:带盘符的
        // File f4 = new File("D:\\code\\javasepromax\\file-io-app\\src\\itheima.txt");
        // 相对路径(重点):不带盘符,默认是直接去工程下寻找文件的。
        File f4 = new File("file-io-app\\src\\itheima.txt");
        System.out.println(f4.length());
    }
}

2.2 File判断和获取方法

在这里插入图片描述

/**
     目标:掌握File提供的判断文件类型、获取文件信息功能
 */
public class FileTest2 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        // 1.创建文件对象,指代某个文件
        File f1 = new File("D:/resource/ab.txt");
        //File f1 = new File("D:/resource/");

        // 2、public boolean exists():判断当前文件对象,对应的文件路径是否存在,存在返回true.
        System.out.println(f1.exists());

        // 3、public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。
        System.out.println(f1.isFile());

        // 4、public boolean isDirectory()  : 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。
        System.out.println(f1.isDirectory());
    }
}

除了判断功能还有一些获取功能,看代码

File f1 = new File("D:/resource/ab.txt");

// 5.public String getName():获取文件的名称(包含后缀)
System.out.println(f1.getName());

// 6.public long length():获取文件的大小,返回字节个数
System.out.println(f1.length());

// 7.public long lastModified():获取文件的最后修改时间。
long time = f1.lastModified();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println(sdf.format(time));

// 8.public String getPath():获取创建文件对象时,使用的路径
File f2 = new File("D:\\resource\\ab.txt");
File f3 = new File("file-io-app\\src\\itheima.txt");
System.out.println(f2.getPath());
System.out.println(f3.getPath());

// 9.public String getAbsolutePath():获取绝对路径
System.out.println(f2.getAbsolutePath());
System.out.println(f3.getAbsolutePath());

2.3 创建和删除方法

/**
 * 目标:掌握File创建和删除文件相关的方法。
 */
public class FileTest3 {
    public static void main(String[] args) throws Exception {
        // 1、public boolean createNewFile():创建一个新文件(文件内容为空),创建成功返回true,反之。
        File f1 = new File("D:/resource/itheima2.txt");
        System.out.println(f1.createNewFile());

        // 2、public boolean mkdir():用于创建文件夹,注意:只能创建一级文件夹
        File f2 = new File("D:/resource/aaa");
        System.out.println(f2.mkdir());

        // 3、public boolean mkdirs():用于创建文件夹,注意:可以创建多级文件夹
        File f3 = new File("D:/resource/bbb/ccc/ddd/eee/fff/ggg");
        System.out.println(f3.mkdirs());

        // 3、public boolean delete():删除文件,或者空文件,注意:不能删除非空文件夹。
        System.out.println(f1.delete());
        System.out.println(f2.delete());
        File f4 = new File("D:/resource");
        System.out.println(f4.delete());
    }
}

1.mkdir(): 只能创建单级文件夹、
2.mkdirs(): 才能创建多级文件夹
3.delete(): 文件可以直接删除,但是文件夹只能删除空的文件夹,文件夹有内容删除不了。

2.4 遍历文件夹方法

在这里插入图片描述


public class FileTest4 {
    public static void main(String[] args) {
        // 1、public String[] list():获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。
        File f1 = new File("D:\\course\\待研发内容");
        String[] names = f1.list();
        for (String name : names) {
            System.out.println(name);
        }

        // 2、public File[] listFiles():(重点)获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)
        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file.getAbsolutePath());
        }

        File f = new File("D:/resource/aaa");
        File[] files1 = f.listFiles();
        System.out.println(Arrays.toString(files1));
    }
}`

1.当主调是文件时,或者路径不存在时,返回null
2.当主调是空文件夹时,返回一个长度为0的数组
3.当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹路径放在File数组中,并把数组返回
4.当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在FIle数组中,包含隐藏文件
5.当主调是一个文件夹,但是没有权限访问时,返回null

三、Runtime类—常见api

个类可以用来获取JVM的一些信息,也可以用这个类去执行其他的程序。其基本使用代码演示如下:

/**
 *  目标:了解下Runtime的几个常见方法。
 */
public class RuntimeTest {
    public static void main(String[] args) throws IOException, InterruptedException {

        // 1、public static Runtime getRuntime() 返回与当前Java应用程序关联的运行时对象。
        Runtime r = Runtime.getRuntime();

        // 2、public void exit(int status) 终止当前运行的虚拟机,该参数用作状态代码; 按照惯例,非零状态代码表示异常终止。
        // r.exit(0);

        // 3、public int availableProcessors(): 获取虚拟机能够使用的处理器数。
        System.out.println(r.availableProcessors());

        // 4、public long totalMemory() 返回Java虚拟机中的内存总量。
        System.out.println(r.totalMemory()/1024.0/1024.0 + "MB"); // 1024 = 1K     1024 * 1024 = 1M

        // 5、public long freeMemory() 返回Java虚拟机中的可用内存量
        System.out.println(r.freeMemory()/1024.0/1024.0 + "MB");

        // 6、public Process exec(String command) 启动某个程序,并返回代表该程序的对象。
        // r.exec("D:\\soft\\XMind\\XMind.exe");
        Process p = r.exec("QQ");
        Thread.sleep(5000); // 让程序在这里暂停5s后继续往下走!!
        p.destroy(); // 销毁!关闭程序!
    }
}

四、递归文件搜索执行脚本文件

在了解和掌握上述基本知识的基础上,我们可以得出一中的需求的解决思路是这样的:

1.先调用文件夹的listFiles方法,获取文件夹的一级内容,得到一个数组
2.然后再遍历数组,获取数组中的File对象
3.因为File对象可能是文件也可能是文件夹,所以接下来就需要判断
判断File对象如果是文件,就获取文件名,如果文件名是QQ.exe则打印,否则不打印
判断File对象如果是文件夹,就递归执行1,2,3步骤
所以:把1,2,3步骤写成方法,递归调用即可。

最终的实现代码如下:

/**
 * 需求:掌握文件搜索的实现。
 */
public class RecursionTest3 {
    public static void main(String[] args) throws Exception {
          searchFile(new File("D:/") , "QQ.exe");
    }

    /**
     * 去目录下搜索某个文件
     * @param dir  目录
     * @param fileName 要搜索的文件名称
     */
    public static void searchFile(File dir, String fileName) throws Exception {
        // 1、把非法的情况都拦截住
        if(dir == null || !dir.exists() || dir.isFile()){
            return; // 代表无法搜索
        }

        // 2、dir不是null,存在,一定是目录对象。
        // 获取当前目录下的全部一级文件对象。
        File[] files = dir.listFiles();

        // 3、判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象。
        if(files != null && files.length > 0){
            // 4、遍历全部一级文件对象。
            for (File f : files) {
                // 5、判断文件是否是文件,还是文件夹
                if(f.isFile()){
                    // 是文件,判断这个文件名是否是我们要找的
                    if(f.getName().contains(fileName)){
                        System.out.println("找到了:" + f.getAbsolutePath());
                        Runtime runtime = Runtime.getRuntime();
                        runtime.exec(f.getAbsolutePath());  //执行qq
                    }
                }else {
                    // 是文件夹,继续重复这个过程(递归)
                    searchFile(f, fileName);
                }
            }
        }
    }
}

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

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

相关文章

老师怎样夸学生

老师夸学生可以从以下几个方面入手: 1. 表扬学生的思维深度和独立思考能力。如果学生在文章中有独特的思考角度和深度的思考,老师可以直接点出来赞扬。 2. 赞美学生的语言表达。如果学生的文章用词精准、文笔流畅,老师可以夸奖学生的语言表达…

【人体解剖学与组织胚胎学】练习一高度相联知识点整理及对应习题

文章目录 [toc]骨性鼻旁窦填空题问答题 关节填空题简答题 胸廓填空题简答题![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/827e7d1db3af42858d8734bb81911fea.jpeg)补充 骨性鼻旁窦 填空题 问答题 关节 填空题 简答题 胸廓 填空题 简答题 补充 第二肋对应胸骨…

ChatGPT哪些行业需要学习?

2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

7天快速学习计算机基础必考八股文day01:计算机网络

day01计算机网络目录一览图 TCP、UDP协议分别属于什么层——OSI七层模型详解请简述HTTP1.0、1.1、2.0的主要区别——HTTP版本详解请简述常见HTTP状态码及含义——HTTP报文详解请简述对称加密、非对称加密的异同——安全传输的基础请简述HTTPS加密认证的过程——TLS技术详解请简…

9.Unity搭建HTTP服务器

搭建HTTP服务器的几种方式 //1.使用别人做好的HTTP服务器软件,一般作为资源服务器时使用该方式(学习阶段建议使用) //2.自己编写HTTP服务器应用程序,一般作为Web服务器 或者 短链接游戏服务器时 使用该方式 使用别人做好的HTTP服…

JDK8升级11常见问题

JDK8升级11常见问题 1. 使用rt.jar/jce.jar情况 原代码&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><targe…

P=NP?

背景&#xff1a;   2000年5月24日&#xff0c;新罕布什尔州的克莱数学研究所列出了数学和计算机科学中七个未解决的问题。然而&#xff0c;直到今天&#xff0c;这些问题中只有一个被解决了&#xff0c;那就是庞加莱猜想&#xff08;Poincar Conjecture&#xff09;——被俄…

Linux下的java环境搭建

1&#xff0c;安装jdk 上传linux使用的jdk到/opt目录下 解压tar -zxvf文件 配置环境变量 vim /etc/profile 在文件中添加 export JAVA_HOME/opt/jdk8 export PATH$PATH:$JAVA_HOME/bin 使文件生效 source /etc/profile 2,安装tomcat 将tomcat包解压&#xff0c;进入bi…

Vue 官方周报 #122 - 如何使用Head插件

Hi &#x1f44b; 本周的问题中&#xff0c;您将学习在Vue中如何使用Head插件。 unhead是一个与框架无关的文档头管理器&#xff0c;您可以使用它来管理页面元数据&#xff0c;如 Vue应用程序中的标题。 它用于Nuxt核心&#xff0c;是UnJS生态系统的一部分。 安装 首先&…

rancher harvester deploy demo 【部署 harvester v1.2.1】

简介 Harvester 是一个现代的、开放的、可互操作的、基于Kubernetes的超融合基础设施(HCI)解决方案。它是一种开源替代方案&#xff0c;专为寻求云原生HCI解决方案的运营商而设计。Harvester运行在裸机服务器上&#xff0c;提供集成的虚拟化和分布式存储功能。除了传统的虚拟机…

Git and solve the problem denied to xx

创建仓库 配置Git git config user.name git config user.email git config MINGW64 /e/GithubCode $ git config --global user.name "name"MINGW64 /e/GithubCode $ git config --global user.email "mailxx.com" 生产ssh ssh-keygen -t rsa -C “xx…

了解应用层的HTTP协议与HTTPS协议,在常规请求的应用中Get与Post的区别

一、HTTP协议 1、http协议的特性2、http协议的请求 请求行 GET请求POST 请求(人脸识别方案)两个请求的区别本质区别&#xff1a; &#xff08;1&#xff09;url 携带的参数是否可见&#xff1a;&#xff08;2&#xff09;参数传递方式&#xff08;3&#xff09;缓存性&#xf…

PWM控制器电路D9741,定时闩锁、短路保护电路,输出基准电压(2.5V) 采用SOP16封装形式

D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点&#xff1a;● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电…

运维知识点-PostgreSql

PostgreSql 下载安装地址安装组件数据目录设置superuser密码 端口安装语言安装完成&#xff0c;是否安装Stack Builder 下载 https://www.postgresql.org/download/windows/ https://get.enterprisedb.com/postgresql/postgresql-13.7-1-windows-x64.exe 我下载的 13.7 安装…

揭秘接口测试的必备基础知识!

这一篇讲接口测试的基础&#xff0c;如果你还在做手工测试&#xff0c;你可以从这里开始入门&#xff0c;做接口测试是最容易的一种自动化测试。 一、接口测试是什么 首先要理解接口测试就是测接口&#xff0c;如图所示&#xff1a; 让我们以数据驱动的视角来看接口测试&#…

内网协议区别

今天面试的时候被面试官问到内网隧道技术中的协议有什么区别&#xff0c;平时只注重使用不注重原理&#xff0c;学习记录 2023-11-30 网络层&#xff1a;IPV6 隧道、ICMP 隧道、GRE 隧道 传输层&#xff1a;TCP 隧道、UDP 隧道、常规端口转发 应用层&#xff1a;SSH 隧道、HTTP…

Java-宋红康-(P133-P134)-多线程创建方式(Thread and Runnable)

b站视频 133-多线程-线程创建方式1&#xff1a;继承Thread类_哔哩哔哩_bilibili 目录 3.1 继承Thread 3.1.1 继承Thread类方式 3.1.2 线程的执行流程 3.1.3 线程内存图 3.1.4 run()方法和start()方法 3.1.5 线程名字的设置和获取 3.1.6 获取运行main方法线程的名字 3.…

双列集合 Map常见的API Map遍历方式 HashMap LinkedHashMap treeMap

目录 双列集合双列集合的特点 双列集合体系结构Map常见的APIMap遍历方式Map的遍历方式一(键找值)遍历方式二键值对遍历方式三lambda表达式 HashMap练习1练习二LinkedHashMapTreeMapTreeMap练习1二三 双列集合 双列集合可以记录两个元素.一个称为键一个称为值.合称为键值对,又叫…

centos7防火墙开启端口

1.查看防火墙状态 firewall-cmd --state如果返回的not running&#xff0c;那么需要先开启防火墙 2.开启关闭防火墙 systemctl start firewalld.service systemctl stop firewalld.service systemctl restart firewalld.service3.开放指定端口 firewall-cmd --zonepublic -…

支持Upsert、Kafka Connector、集成Airbyte,Milvus助力高效数据流处理

Milvus 已支持 Upsert、 Kafka Connector、Airbyte&#xff01; 在上周的文章中《登陆 Azure、发布新版本……Zilliz 昨夜今晨发生了什么&#xff1f;》&#xff0c;我们已经透露过 Milvus&#xff08;Zilliz Cloud&#xff09;为提高数据流处理效率&#xff0c; 先后支持了 Up…