Skip to content

IO基础操作

File

在 Java 中,File 类是 java.io 包的一部分,用于表示文件和目录路径名的抽象表示形式。它可以用来创建、删除、获取和设置文件或目录的属性。

File 类不可以用于文件内容的读写;如果需要读写文件内容,应使用 FileInputStreamFileOutputStreamFileReaderFileWriter 等其他流类。

File 这个类一般是用于对于文件或者目录的创建删除的常用操作。

创建文件操作

创建一个 File 实例不会在硬盘上创建一个文件,它只是一个抽象表示。要创建或访问文件,可以如下操作:

File file = new File("path/to/file.txt");

这里的路径可以是相对路径或绝对路径。相对路径相对于当前工作目录。

如果要看当前工作空间目录是哪个,可以通过 下述操作查看。

// 获取当前工作目录  
String workingDir = System.getProperty("user.dir");  
// 打印当前工作目录  
System.out.println("当前工作目录: " + workingDir);

日常记录

遍历 D 盘路径下的文件,获取指定文件名的路径位置

操作一:使用 File 进行遍历操作

环境:本地电脑,D 盘占用磁盘大概 300 G 左右

输出:

Found: D:\01_LQ\DiaryLearn\2024年Flag.mp4
Found: D:\01_LQ\DiaryLearn\Java\MindMap\2024年Flag.mp4
Cannot list files in the directory or access is denied.
方法调用耗时:8576毫秒
package com.ruoyi.luoqi.file;

/**
 * @author luoqi
 * @File FolderTraversalExample.java
 * @Desc
 * @Create 2024/4/12 16:10
 * @ChangeList --------------------------------------------------------------------
 * Date                          Editor                     ChangeReason
 */
import java.io.File;

public class FileSearcherMethodOne {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String folderName = "D:\\";
        String filename = "2024年Flag.mp4";
        findFilePath(folderName,filename);
        long end = System.currentTimeMillis();
        System.out.println("方法调用耗时:" + (end - start) + "毫秒");
    }

    private static void findFilePath(String folderName,String filename){
        // 步骤1:创建一个文件对象来表示要遍历的文件夹
        File folder = new File(folderName);

        // 步骤2:检查文件对象是否存在,并且是一个文件夹
        if (folder.exists() && folder.isDirectory()) {
            // 步骤3:获取文件夹下的所有文件和子文件夹
            File[] files = folder.listFiles();

            // 步骤4:遍历所有文件和子文件夹
            for (File file : files) {
                if (file.isDirectory()) {
                    // 是一个文件夹,递归遍历
                    traverseFolder(file,filename);
                } else {
                    // 是一个文件
                    String fileName = file.getName();
                    // 对文件名称进行处理
                    if(fileName.equals(filename)){
                        String path = file.getPath();
                        System.out.println("Found: " + path);
                    }
                }
            }
        } else {
            // 文件夹不存在或者不是一个文件夹
        }
    }

    private static void traverseFolder(File folder,String filename) {
        if (folder == null || !folder.exists() || !folder.isDirectory()) {
            System.out.println("Provided file is not a directory or does not exist.");
            return;
        }

        File[] files = folder.listFiles();
        if (files == null) {  // 检查返回值是否为 null
            System.out.println("Cannot list files in the directory or access is denied.");
            return;
        }
        for (File file : files) {
            if (file.isDirectory()) {
                // 是一个文件夹,递归遍历
                traverseFolder(file,filename);
            } else {
                // 是一个文件
                String fileName = file.getName();
                // 对文件名称进行处理
                if(fileName.equals(filename)){
                    String path = file.getPath();
                    System.out.println("Found: " + path);
                }
            }
        }
    }

}

进行了一个扫描文件操作,然后放入到 Node 树节点中

FileNode

package com.ruoyi.luoqi.file;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author luoqi
 * @File FileNode.java
 * @Desc
 * @Create 2024/4/12 14:44
 * @ChangeList --------------------------------------------------------------------
 * Date                          Editor                     ChangeReason
 */
public class FileNode {
    private String path;
    private String fileName;
    private List<FileNode> children;
    private static Map<String, List<FileNode>> fileMap = new HashMap<>();  // 用于存储文件名和节点的映射

    public FileNode(String path, String fileName) {
        this.path = path;
        this.fileName = fileName;
        this.children = new ArrayList<>();
        addToFileMap(fileName, this);
    }

    public void addChild(FileNode child) {
        this.children.add(child);
    }

    public String getPath() {
        return path;
    }

    public String getFileName() {
        return fileName;
    }

    public List<FileNode> getChildren() {
        return children;
    }

    public static Map<String, List<FileNode>> getFileMap() { return fileMap;}

    // 添加节点到fileMap中
    private static void addToFileMap(String fileName, FileNode node) {
        fileMap.computeIfAbsent(fileName, k -> new ArrayList<>()).add(node);
    }

    // 通过文件名获取FileNode列表
    public static List<FileNode> getNodesByFileName(String fileName) {
        return fileMap.getOrDefault(fileName, new ArrayList<>());
    }
}

FileSearcherMethodTwo

package com.ruoyi.luoqi.file;

import java.io.File;
import java.nio.file.Path;
import java.util.List;

/**
 * @author luoqi
 * @File FileSearcherMethodTwo.java
 * @Desc
 * @Create 2024/4/12 17:50
 * @ChangeList --------------------------------------------------------------------
 * Date                          Editor                     ChangeReason
 */
public class FileSearcherMethodTwo {

    private static FileNode fileNode;

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        //String folderName = "D:\\01_LQ\\DiaryLearn\\Java";
        String folderName = "D:\\";
        String filename = "2024年Flag.mp4";
        scanFilePath(folderName,filename);
        long end = System.currentTimeMillis();
        System.out.println("方法调用耗时:" + (end - start) + "毫秒");

        long start2 = System.currentTimeMillis();
        //List<FileNode> fileNodes = fileNode.getFileMap().get(filename);
        List<FileNode> nodes = fileNode.getNodesByFileName(filename);
        if (nodes.isEmpty()) {
            System.out.println("No files found with the name " + filename);
        } else {
            System.out.println("Found files:");
            for (FileNode node : nodes) {
                System.out.println(node.getPath());
            }
        }
        long end2 = System.currentTimeMillis();
        System.out.println("方法2调用耗时:" + (end2 - start2) + "毫秒");
    }

    private static void scanFilePath(String folderName,String filename){
        // 步骤1:创建一个文件对象来表示要遍历的文件夹
        File folder = new File(folderName);
        //当的确需要将文件路径和文件名信息放入到整体的一个 HashMap 中
        //一方面是进行遍历的时候,一方面是生成新的节点信息,一方面是进行关联上层节点信息,从而形成树结构
        //根节点
        fileNode = new FileNode(folderName, "");
        // 步骤2:检查文件对象是否存在,并且是一个文件夹
        if (folder.exists() && folder.isDirectory()) {
            // 步骤3:获取文件夹下的所有文件和子文件夹
            File[] files = folder.listFiles();

            // 步骤4:遍历所有文件和子文件夹
            for (File file : files) {
                if (file.isDirectory()) {
                    //如果是目录的话,正常应该 Node 对象下 children 不为空,同时 filename 是空的
                    FileNode dirNode = new FileNode(file.getPath(), "");
                    fileNode.addChild(dirNode);
                    // 是一个文件夹,递归遍历
                    traverseFolder(file,filename,dirNode);
                } else {
                    // 是一个文件
                    String fileName = file.getName();
                    // 对文件名称进行处理
                    if(fileName.equals(filename)){
                        String path = file.getPath();
                        //System.out.println("Found: " + path);
                        FileNode fileNodeSon = new FileNode(path, filename);
                        fileNode.addChild(fileNodeSon);
                    }
                }
            }
        } else {
            // 文件夹不存在或者不是一个文件夹
        }
    }

    private static void traverseFolder(File folder,String filename,FileNode fileNode) {
        if (folder == null || !folder.exists() || !folder.isDirectory()) {
            System.out.println("Provided file is not a directory or does not exist.");
            return;
        }

        File[] files = folder.listFiles();
        if (files == null) {  // 检查返回值是否为 null
            System.out.println("Cannot list files in the directory or access is denied.");
            return;
        }
        for (File file : files) {
            if (file.isDirectory()) {
                FileNode dirNode = new FileNode(file.getPath(), "");
                fileNode.addChild(dirNode);
                // 是一个文件夹,递归遍历
                traverseFolder(file,filename,dirNode);
            } else {
                // 是一个文件
                String fileName = file.getName();
                // 对文件名称进行处理
                if(fileName.equals(filename)){
                    String path = file.getPath();
                    //System.out.println("Found: " + path);
                    FileNode fileNodeSon = new FileNode(path, filename);
                    fileNode.addChild(fileNodeSon);
                }
            }
        }
    }
}

输出结果

Cannot list files in the directory or access is denied.
方法调用耗时:7785毫秒
Found files:
D:\01_LQ\DiaryLearn\2024年Flag.mp4
D:\01_LQ\DiaryLearn\Java\MindMap\2024年Flag.mp4
方法2调用耗时:0毫秒

还有一些更高级的内容,比如 NIO、并行流之类的;这个实际放后面看了(掌握程度太浅,实际跑的隐患太大)