38讲 File类

本文介绍了Java中的File类,用于表示文件和目录路径名。File类提供了多种构造方法来创建文件对象,包括基于路径名、父路径和子路径等。文章详细讲解了File对象的常用方法,如判断文件/目录存在、获取文件属性(大小、路径、名称、最后修改时间)以及创建、删除文件和目录。此外,还讨论了如何遍历文件夹内容和进行文件操作,如删除多级目录、计算文件夹大小以及统计文件数量。

1 File简述

File对象表示一个路径。

  • 该路径可以是文件的路径,也可以是文件夹的路径。

  • 该路径可以是已经存在的,也可以是不存在的。

导包: java.io.File

2 File构造方法

方法说明
public File(String pathName)根据文件路径创建文件对象
public File(String parent, String child)根据父路径和子路径创建文件对象
public File(File parent, String child)根据父路径对应文件对象和子路径创建文件对象

说明:

  • 父(级)路径,子(级)路径:如路径 C:\a\b\c.txt ,其中 C:\a\b 就是父级路径,c.txt 就是子级路径。

  • 构造File对象时,既可以传入绝对路径,也可以传入相对路径。绝对路径是以根目录开头的完整路径,例如:

    File f = new File("D:\\IDEA\\test.txt");
    

    注意Windows平台使用 \ 作为路径分隔符,在Java字符串中需要用 \\ 表示一个 \

import java.io.File;

public class FileDemo1 {
    public static void main(String[] args) {
        //根据文件路径创建文件对象
        String pathName = "D:\\IDEA\\test.txt";
        File file1 = new File(pathName);
        System.out.println(file1);	// D:\IDEA\test.txt

        //根据父路径和子路径创建文件对象
        String parent1 = "D:\\IDEA";
        String child1 = "test.txt";
        File file2 = new File(parent1, child1);
        System.out.println(file2);	// D:\IDEA\test.txt

        //根据父路径对应文件对象和子路径创建文件对象
        String parent2 = "D:\\IDEA";
        File parent2File = new File(parent2);
        String child2 = "test.txt";
        File file3 = new File(parent2File, child2);
        System.out.println(file3);	// D:\IDEA\test.txt
    }
}

3 File常用成员方法

3.1 判断

方法说明
boolean isDirectory()判断此路径名表示的File是否为文件夹
boolean isFile()判断此路径名表示的File是否为文件
boolean exists()判断此路径名表示的File是否存在

创建如下文件及文件夹

在这里插入图片描述

import java.io.File;

public class FileDemo2 {
    public static void main(String[] args) {
        File file1 = new File("D:\\test\\aaa.txt"); //文件
        File file2 = new File("D:\\test\\bbb");     //文件夹
        File file3 = new File("D:\\test\\ccc");     //不存在的路径名

        System.out.println(file1.isDirectory());//false
        System.out.println(file1.isFile());     //true
        System.out.println(file1.exists());     //true

        System.out.println(file2.isDirectory());//true
        System.out.println(file2.isFile());     //false
        System.out.println(file2.exists());     //true
        
        System.out.println(file3.isDirectory());//false
        System.out.println(file3.isFile());     //false
        System.out.println(file3.exists());     //false
    }
}

3.2 获取

方法说明
long length()返回文件的大小(不能直接获取文件夹)。单位:字节
String getAbsolutePath()返回文件的绝对路径
String getPath()返回定义文件时使用的路径
String getName()返回文件带后缀的名称,或者返回文件夹的名称。
long lastModified()返回文件最后修改的时间。单位:毫秒值
File getParentFile()返回文件以父级路径创建的文件对象

创建如下文件及文件夹

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileDemo3 {
    public static void main(String[] args) {
        File file1 = new File("D:\\test\\aaa.txt"); //D:\test里的文件
        File file2 = new File("D:\\test\\bbb");     //D:\test里的文件夹
        File file3 = new File("do24File\\aaa.txt"); //项目下的文件夹
        //返回文件的大小
        System.out.println(file1.length());     	//文件大小:3
        System.out.println(file2.length());     	//文件夹大小:0。该方法不能直接返回文件夹大小。

        //返回文件的绝对路径
        System.out.println(file1.getAbsoluteFile());    //D:\test\aaa.txt
        System.out.println(file3.getAbsoluteFile());    //D:\IDEA\StudyJAVA\do24File\aaa.txt

        //返回定义文件时使用的路径
        System.out.println(file1.getPath());    	//D:\test\aaa.txt
        System.out.println(file3.getPath());    	//do24File\aaa.txt

        //返回文件带后缀的名称,或者返回文件夹的名称。
        System.out.println(file1.getName());    	//aaa.txt
        System.out.println(file2.getName());    	//bbb

        //返回文件最后修改的时间。单位:毫秒值
        long time = file1.lastModified();
        System.out.println(time);       			//1672048639864
        Date date = new Date(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日, HH:mm:ss");
        String format = sdf.format(date);
        System.out.println(format);     			//2022年12月26日, 17:57:19
        
        //返回文件的父级路径
        File parentFile = file1.getParentFile();
        System.out.println(parentFile);    			 //D:\test
    }
}

3.3 创建、删除

方法说明
boolean createNewFile()创建一个新的空文件
boolean mkdir()创建单级文件夹
boolean mkdirs()创建单级或多级文件夹
boolean delete()删除文件空文件夹(直接删除不进回收站)

方法 createNewFile() 的3个注意点:

  1. 如果当前路径表示的文件是不存在的,则会在当前路径创建指定文件,返回true。如果已经存在,不创建文件,返回false。

验证:

先创建如下文件及文件夹:

在这里插入图片描述

执行如下代码:

public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\test\\ccc.txt");
        System.out.println(file1.createNewFile());
    }
}

第一次执行,输出 true ,并且在指定目录下创建了指定的文件

在这里插入图片描述

再次执行,输出 false

  1. 如果父级路径不存在,则会抛出异常 IOException
public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\test\\ccc\\ccc.txt");	//ccc文件夹是不存在的
        System.out.println(file1.createNewFile());
        //Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
    }
}
  1. createNewFile 创建的一定是文件。如果路径不包含后缀名,则创建一个没有后缀名的文件。
public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\test\\ccc");
        System.out.println(file1.createNewFile());	//true
    }
}

在这里插入图片描述

3.4 获取并遍历

方法说明
static File[] listRoots()获取系统中所有可用盘符
String[] list()获取当前路径下的全部内容
String[] list(FilenameFilter filter)利用文件名过滤器获取当前路径下的内容
File[] listFiles()获取当前路径下的全部内容
File[] listFiles(FileFilter filter)利用文件名过滤器获取当前路径下的内容
File[] listFiles(FilenameFilter filter)利用文件名过滤器获取当前路径下的内容

方法 listFiles() 注意:

  • 当调用者File表示的路径不存在时,返回null
  • 当调用者File表示的路径是文件时,返回null
  • 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
  • 当调用者File表示的路径是空文件夹时,返回一个长度为0的File类型数组
  • 当调用者File表示的路径是有内容的文件夹时,返回包含所有文件路径和文件夹路径的File类型数组(包含隐藏文件)

创建如下文件及文件夹:

在这里插入图片描述

public class FileDemo5 {
    public static void main(String[] args) {
        File file = new File("D:\\test");

        File[] files = file.listFiles();

        for (File file1 : files) {
            System.out.print(file1 + ", ");
            //D:\test\aaa, D:\test\aaa.txt, D:\test\bbb, D:\test\bbb.txt, 
        }
    }
}

4 常用操作

所有操作均可按以下步骤实现:

  1. 进入文件夹
  2. 遍历文件夹
  3. 判断是否为文件,并执行相关操作
  4. 判断是否为文件夹,并执行相关操作

4.1 删除多级目录

public class Demo {
    private static void deleteFiles(File file) {
        //1.进入文件夹
        File[] files = file.listFiles();
        //2.遍历文件夹
            for (File f : files) {
                if (f.isFile()) {
                    //3.如果是文件,直接删除
                    f.delete();
                } else {
                    //4.如果是文件夹,递归
                    deleteFiles(f);
                }
            }

        file.delete();
    }
}

4.2 计算文件夹大小

public class Demo {
    private static long getLength(File file) {
        long len = 0;
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                //如果是文件,直接获取大小并累加
                len += f.length();
            } else {
                //如果是文件夹,递归获取大小并累加
                len += getLength(f);
            }
        }

        return len;
    }
}

4.3 统计各种文件的数量

public class Demo {
        private static HashMap<String, Integer> getCount(File file) {
        HashMap<String, Integer> hm = new HashMap<>();
        File[] files = file.listFiles();
        for (File f : files) {
            //如果是文件,直接获取后缀名并统计
            if (f.isFile()) {
                String[] split = f.getName().split("\\.");
                if (split.length >= 2) {
                    String endName = split[split.length - 1];
                    if (hm.containsKey(endName)) {
                        int count = hm.get(endName);
                        count++;
                        hm.put(endName, count);
                    } else {
                        hm.put(endName, 1);
                    }
                }
            }
            //如果是文件夹,递归并统计数量并累加
            else {
                HashMap<String, Integer> sonMap = getCount(f);
                Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    String endName = entry.getKey();
                    int value = entry.getValue();

                    if (hm.containsKey(endName)) {
                        int count = hm.get(endName);
                        count += value;
                        hm.put(endName, count);
                    } else {
                        hm.put(endName, 1);
                    }
                }

            }
        }

        return hm;
    }
}
Tomcat 8.5 在服务器启动时会生成详细的日志信息,这些信息可以帮助运维人员或开发者了解 Tomcat 的启动状态、部署过程以及潜在的错误。以下是一些常见的日志消息及其含义: ### 日志信息分 1. **启动阶段日志** Tomcat 启动时会加载其核心组件,如 `Server`、`Service`、`Connector` 和 `Engine` 等,并初始化线程池和网络连接器。 示例日志: ``` INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.5.32 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Jun 20 2018 19:56:00 UTC INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 3.10.0-862.el7.x86_64 ``` 2. **部署 Web 应用程序** Tomcat 会自动部署 `webapps` 目录下的 `.war` 文件或已解压的应用目录。 示例日志: ``` INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/app.war] INFO [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.validateJarFile Validation of jar /usr/local/tomcat/webapps/app/WEB-INF/lib/servlet-api.jar failed - see IDE log for details. INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized() ``` 3. **应用上下文初始化** 每个 Web 应用在启动时都会调用 `ServletContextListener.contextInitialized()` 方法,用于执行自定义初始化逻辑。 示例日志: ``` INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext INFO [localhost-startStop-1] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext: initialization started ``` 4. **连接器与端口绑定** Tomcat 会尝试绑定配置文件 `server.xml` 中定义的 HTTP、HTTPS 和 AJP 连接器。 示例日志: ``` INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] ``` 5. **JVM 内存与环境信息** Tomcat 会在启动时打印 JVM 使用的内存设置和系统属性。 示例日志: ``` INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 345 ms INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.32 ``` ### 常见问题识别 - **应用未成功部署**:如果日志中出现 `No context configured` 或 `Failed to deploy`,说明应用部署失败,可能是因为 WAR 文件损坏、权限不足或依赖缺失。 - **端口冲突**:如果 Tomcat 启动时报错 `Address already in use`,表示端口已被其他进程占用。 - **加载异常**:出现 `ClassNotFoundException` 或 `NoClassDefFoundError` 表示路径不正确或缺少 JAR 包。 ### 查看日志位置 Tomcat 的日志通常位于 `$CATALINA_HOME/logs` 目录下,主要的日志文件包括: - `catalina.out`:主日志文件,包含所有启动和运行时输出。 - `localhost.log`:记录特定于默认主机的请求日志。 - `manager.log` 和 `host-manager.log`:分别记录管理应用和虚拟主机管理的日志。 ```bash tail -f /usr/local/tomcat/logs/catalina.out ``` ### 示例代码:查看 Tomcat 日志脚本 ```bash #!/bin/bash # 查看 Tomcat 主日志 LOG_FILE="/usr/local/tomcat/logs/catalina.out" if [ -f "$LOG_FILE" ]; then echo "正在查看 $LOG_FILE ..." tail -n 50 $LOG_FILE else echo "日志文件 $LOG_FILE 不存在!" fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值