Appearance
File
在 Java 中,File 类是 java.io 包的一部分,用于表示文件和目录路径名的抽象表示形式。它可以用来创建、删除、获取和设置文件或目录的属性。
File 类不可以用于文件内容的读写;如果需要读写文件内容,应使用 FileInputStream、FileOutputStream、FileReader、FileWriter 等其他流类。
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、并行流之类的;这个实际放后面看了(掌握程度太浅,实际跑的隐患太大)