JAVA|文件管理系统
前言
文件管理系统是我们在使用电脑是经常会使用的功能,支持创建、删除、移动文件等一系列功能操作。接下来将开发一款含有大部分基础功能的文件管理系统。
本次将了解文件管理系统的基本原理,并通过控制台实现对文件及目录的部分处理操作,以加深对文件管理系统的理解,为后续文件控制系统的开发奠定基础。
文章目录
一、什么是文件?
文件(File)是计算机中存储数据的基本单元,本质是一组按特定格式组织的二进制数据流(0 和 1),用于长期保存文本、图片、视频、程序等信息。
文件 vs 目录:
| 类型 | 作用 | 核心特征 |
|---|---|---|
| 文件 | 存储具体数据(文本 / 二进制) | 有大小、内容,不可包含其他文件 |
| 目录 | 组织和管理文件 | 无大小、无内容,可包含文件 / 子目录 |
二、LINUX命令
在Linux系统中,在处理文件和目录时,有许多常用的命令行工具和命令。以下是一些最常用的文件和目录相关的命令:
-
ls- 列出目录内容- 示例:
ls列出当前目录内容 - 示例:
ls -l以长格式列出详细信息 - 示例:
ls -a列出所有文件,包括隐藏文件
- 示例:
-
cd- 改变当前目录- 示例:
cd /path/to/directory改变当前工作目录到指定路径 - 示例:
cd ..返回上一级目录 - 示例:
cd ~返回用户的主目录
- 示例:
-
pwd- 打印当前工作目录的完整路径- 示例:
pwd显示当前目录的绝对路径
- 示例:
-
mkdir- 创建新目录- 示例:
mkdir new_directory在当前目录下创建一个名为new_directory的新目录 - 示例:
mkdir -p parent/child/new_directory创建多级目录结构
- 示例:
-
rmdir- 删除空目录- 示例:
rmdir directory_name删除名为directory_name的空目录
- 示例:
rm- 删除文件或目录- 示例:
rm file_name删除名为file_name的文件 - 示例:
rm -r directory_name删除名为directory_name的目录及其内容(递归) - 注意:使用
rm -r时要小心,以避免误删除重要数据。
- 示例:
-
cp- 复制文件或目录- 示例:
cp source_file dest_file将source_file复制为dest_file - 示例:
cp -r source_directory dest_directory递归复制目录及其内容
- 示例:
-
mv- 移动或重命名文件或目录- 示例:
mv old_name new_name重命名文件或目录 - 示例:
mv file_or_directory /path/to/destination将文件或目录移动到指定路径
- 示例:
-
touch- 创建空文件或更新文件的时间戳- 示例:
touch new_file.txt创建一个名为new_file.txt的空文件 - 示例:
touch existing_file.txt更新existing_file.txt的访问和修改时间
- 示例:
二、文件管理系统设计
1. 核心属性 - 基础信息:
- 名称(name)
- 路径(path)
- 格式(format)
- 大小(size)
- 类型(文件/目录,type)
- 时间(time)
- 权限(读写等)
2. 核心方法 - 基础操作:
在处理文件和目录时,采用linux命令风格来实现以下几种基础操作:
- 查看当前目录下的文件和目录(ls)
- 创建目录(mkdir)
- 创建文件(touch)
- 删除文件/目录(rm)
- 退出系统(exit)
- 显示帮助信息(help)
3. 规避命名冲突
- 自定义类(如文件类)避免与系统内置类(如File类)重名
三、文件管理系统代码框架
1、核心属性与全局变量
1.1 成员属性(文件 / 目录的核心信息)
// 核心属性
String name; // 名称
String path; // 路径(绝对路径,如 /test/file)
String format; // 格式(仅文件有效,目录为空)
int size; // 大小(文件:KB;目录:0)
String type; // 类型:文件 / 目录
String permission; // 权限(默认 读写)
这些属性是每个文件 / 目录的 “身份信息”,通过构造方法初始化,后续所有操作(查找、删除、显示)都依赖这些属性。
1.2 静态全局变量
// 存储所有文件/目录的集合
static final List<SFile1> fileSystem = new ArrayList<>();
// 当前工作目录
static String dir = "/";
fileSystem:用ArrayList存储所有资源;dir:记录用户当前所在目录,构建绝对路径。
2、构造方法
因为文件和目录的属性不同(文件有格式、大小,目录没有),所以设计了两个构造方法,分别对应两种资源类型:
2.1 文件构造方法
// 文件构造方法:创建文件时调用,需要传入 名称、路径、格式、大小
public SFile1(String name, String path, String format, int size) {
this.name = name; // 赋值文件名
this.path = path; // 赋值绝对路径
this.format = format; // 赋值文件格式
this.size = size; // 赋值文件大小(KB)
this.type = "文件"; // 固定类型为“文件”
this.permission = "读写"; // 默认权限
}
- 必须传入
format和size,因为文件的核心特征是 “格式” 和 “大小”; type固定为 “文件”,避免手动输入错误。
2.2 目录构造方法
// 目录构造方法:创建目录时调用,只需传入 名称、路径(格式和大小固定)
public SFile1(String name, String path) {
this.name = name; // 赋值目录名
this.path = path; // 赋值绝对路径
this.format = ""; // 目录无格式,设为空字符串
this.size = 0; // 目录无大小,设为0
this.type = "目录"; // 固定类型为“目录”
this.permission = "读写"; // 默认权限
}
- 不需要
format和size参数,直接固定为默认值; type固定为 “目录”,与文件做明确区分。
3、方法
3.1 构建绝对路径(buildAbsolutePath)
// 基于当前工作目录,构建“绝对路径”
static String buildAbsolutePath(String name) {
if (dir.equals("/")) { // 如果当前在根目录(/),直接拼接为 "/名称"
return "/" + name;
} else { // 如果当前在子目录(如 /docs),拼接为 "/docs/名称"
return dir + "/" + name;
}
}
- 用途:用户输入相对名称(如
mkdir test)时,自动转为绝对路径(如当前在/docs,则转为/docs/test); - 示例:
- 当前目录
/→buildAbsolutePath("test")→/test; - 当前目录
/docs→buildAbsolutePath("file")→/docs/file。
- 当前目录
3.2 检查名称冲突(isNameExists)
// 检查当前目录下是否已存在同名文件/目录(避免重复创建)
static boolean isNameExists(String name) {
String targetPath = buildAbsolutePath(name); // 先构建目标绝对路径
for (SFile1 file : fileSystem) { // 遍历所有资源
if (file.path.equals(targetPath)) { // 对比路径
return true; // 存在冲突,返回true
}
}
return false; // 无冲突,返回false
}
- 核心逻辑:文件系统中 “绝对路径唯一”,所以判断 “当前目录是否有同名文件/目录”,本质是判断 “目标路径是否已存在”;
- 用途:
mkdir和touch命令执行前,都会调用这个方法,避免重复创建。
3.3 查找当前目录下的文件 / 目录(findFileInDir)
// 根据名称查找当前目录下的文件/目录(返回找到的资源,没找到返回null)
static SFile1 findFileInDir(String name) {
String targetPath = buildAbsolutePath(name); // 构建目标绝对路径
for (SFile1 file : fileSystem) { // 遍历所有资源
if (file.path.equals(targetPath)) { // 匹配路径
return file; // 找到,返回该资源对象
}
}
return null; // 没找到,返回null
}
- 用途:
rm命令删除资源前,需要先通过这个方法找到要删除的对象;如果返回null,则提示 “未找到”。
4、核心功能方法
每个方法对应一个用户命令(ls/mkdir/touch/rm/help),是程序的核心逻辑。
4.1 ls命令:查看当前目录下的所有资源
static void ls() {
System.out.println("\n当前目录:" + dir);
System.out.println("------------------------------------------------");
System.out.printf("%-10s %-10s %-8s %s%n", "类型", "大小(KB)", "权限", "名称");
System.out.println("------------------------------------------------");
boolean falg = false;
for (SFile1 file : fileSystem) {
// 只显示当前目录的直接子文件/目录
String expectedPath = dir.equals("/") ? "/" + file.name : dir + "/" + file.name;
if (file.path.equals(expectedPath)) {
falg = true;
String Name = file.type.equals("目录") ? file.name + "/" : file.name + "." + file.format;
System.out.printf("%-10s %-10d %-8s %s%n",
file.type, file.size, file.permission, Name);
}
}
if (!falg) {
System.out.println("当前目录为空");
}
System.out.println("------------------------------------------------");
}
- 功能:遍历
fileSystem中所有资源,按 “类型、大小、权限、名称” 的格式显示;
4.2 mkdir命令:创建目录
static void mkdir(String dirName) {
// 目录名不能为空
if (dirName.isEmpty()) {
System.out.println("目录名不能为空!");
return;
}
// 当前目录是否已存在同名目录/文件
if (isNameExists(dirName)) {
System.out.println("当前目录已存在 '" + dirName + "'!");
return;
}
// 构建目录的绝对路径(调用buildAbsolutePath方法)
String dirPath = buildAbsolutePath(dirName);
// 创建目录对象(调用目录构造方法)
SFile1 newDir = new SFile1(dirName, dirPath);
// 将目录添加到文件系统
fileSystem.add(newDir);
// 提示创建成功
System.out.println("成功创建目录:" + newDir.path + "(权限:" + newDir.permission + ")");
}
- 核心:通过
buildAbsolutePath保证路径唯一,通过isNameExists避免重复创建。
4.3 touch命令:创建文件
static void touch(String fileName, String format, int size) {
// 文件名和格式不能为空
if (fileName.isEmpty() || format.isEmpty()) {
System.out.println("文件名和格式不能为空!");
return;
}
// 当前目录是否已存在同名文件/目录
if (isNameExists(fileName)) {
System.out.println("当前目录已存在 '" + fileName + "'!");
return;
}
// 构建文件的绝对路径
String filePath = buildAbsolutePath(fileName);
// 创建文件对象(调用文件构造方法)
SFile1 newFile = new SFile1(fileName, filePath, format, size);
// 将文件添加到文件系统
fileSystem.add(newFile);
// 提示创建成功(显示完整路径、大小、权限)
System.out.println("成功创建文件:" + newFile.path + "." + newFile.format +
"(大小:" + newFile.size + "KB,权限:" + newFile.permission + ")");
}
- 与
mkdir的区别:多了format和size参数,且创建时调用 “文件构造方法”。
4.4 rm命令:删除文件 / 目录
static void rm(String name) {
// 查找要删除的资源
SFile1 target = findFileInDir(name);
// 校验:如果没找到,提示错误
if (target == null) {
System.out.println("未找到文件/目录 '" + name + "'!");
return;
}
// 执行删除
fileSystem.remove(target);
String displayPath = target.type.equals("目录") ? target.path : target.path + "." + target.format;
System.out.println("成功删除:" + displayPath);
}
- 执行流程:查找目标资源是否存在 → 从
fileSystem中删除 → 提示结果;
4.5 help命令:显示帮助信息
static void help() {
System.out.println("\n===== 文件管理系统帮助 =====");
System.out.println("ls - 查看当前目录下的文件和目录");
System.out.println("mkdir [目录名] - 创建新目录(如 mkdir Test)");
System.out.println("touch [文件名] [格式] [大小KB] - 创建新文件(如 touch test txt 20)");
System.out.println("rm [名称] - 删除文件或空目录(如 rm test)");
System.out.println("help - 显示帮助信息");
System.out.println("exit - 退出系统");
System.out.println("===========================\n");
}
- 功能:向用户展示所有支持的命令及用法。
5、程序入口与命令处理
main负责初始化系统、接收用户输入、解析命令、调用对应功能方法。
5.1 初始化系统
public static void main(String[] args) {
// 创建Scanner对象,用于读取用户输入(控制台交互)
Scanner scanner = new Scanner(System.in);
System.out.println("======================================");
System.out.println("===== 基础文件管理系统 ======");
System.out.println("===== 输入 help 查看可用命令 ======");
System.out.println("======================================\n");
// 初始化根目录(默认存在,路径为 "/",名称为 "root")
fileSystem.add(new SFile1("root", "/"));
- 根目录初始化:程序启动时自动创建根目录
/,用户所有操作都基于根目录; Scanner:用于读取用户在控制台输入的命令。
5.2 循环处理用户命令
while (true) {
// 命令提示符:显示当前目录,模拟终端交互
System.out.print(dir + " > ");
// 读取用户输入的一行命令
String input = scanner.nextLine();
// 处理空输入
if (input.isEmpty())
continue;
// 解析命令:按空格分割输入字符串,得到命令数组(如 "touch test txt 20" → ["touch", "test", "txt", "20"])
String[] cmds = input.split(" ");
String cmd = cmds[0]; // 第一个元素是核心命令(如 "touch"、"ls")
// 执行命令:根据核心命令调用对应功能方法
switch (cmd) {
case "ls": // 查看目录
ls();
break;
case "mkdir": // 创建目录
if (cmds.length < 2) { // 必须传入目录名(1个参数)
System.out.println("格式错误!输入 help 查看可用命令");
} else {
mkdir(cmds[1]); // 传入目录名
}
break;
case "touch": // 创建文件
if (cmds.length < 4) { //必须传入 文件名、格式、大小(3个参数)
System.out.println("格式错误!输入 help 查看可用命令");
} else {
// 提取参数:文件名(cmds[1])、格式(cmds[2])、大小(cmds[3],转为整数)
String fileName = cmds[1];
String format = cmds[2];
int size = Integer.parseInt(cmds[3]);
touch(fileName, format, size);
}
break;
case "rm": // 删除资源
if (cmds.length < 2) {
System.out.println("格式错误!输入 help 查看可用命令");
} else {
rm(cmds[1]);
}
break;
case "help": // 显示帮助
help();
break;
case "exit": // 退出系统
System.out.println("感谢使用,再见!");
System.exit(0);
break;
default:
System.out.println("未知命令 '" + cmd + "'!输入 help 查看可用命令");
}
}
}
- 命令解析逻辑:
- 用
split(" ")分割输入字符串,得到命令数组(如"mkdir docs"→["mkdir", "docs"]); - 第一个元素是核心命令(
cmd),后续元素是参数(如cmds[1]是目录名 / 文件名);
- 用
- 参数检查:每个命令都检查参数数量(如
touch需要 3 个参数);
四、实际操作演示
以 “查看命令→创建目录→创建文件→查看→删除→检查→退出” 为例,展示程序的完整运行流程:
- 程序启动,初始化根目录
/,并输入help查看可用命令;

- 用户输入
mkdir Test→ 解析命令mkdir,参数Test→ 构建路径/Test→ 无冲突 → 创建目录并加入fileSystem→ 提示 “成功创建目录:/Test(权限:读写)”;

- 用户输入
touch test txt 50→ 解析命令touch,参数test、txt、50→ 构建路径/test→ 无冲突 → 创建文件并加入fileSystem→ 提示 “成功创建文件:/test.txt(大小:50KB,权限:读写)”;

- 用户输入
ls→ 遍历fileSystem→ 显示当前目录/下的资源;

-
用户输入
rm test→ 查找路径/test→ 找到文件 → 从fileSystem删除 → 提示 “成功删除:/test.txt”;

-
用户输入
rm Test→ 查找路径/Test→ 找到目录 → 从fileSystem删除 → 提示 “成功删除:/Test”;

-
用户输入
ls→ 遍历fileSystem→ 检查是否删除;

-
用户输入
exit→ 提示 “感谢使用,再见!” → 程序终止。

五、版本规划
- V1.0:显示本地目录结构
- V2.0:新增创建文件、创建文件夹功能
- V3.0:支持点击按钮打开文件夹、点击标签打开文件
- V4.0:新增文件搜索功能
更多推荐


所有评论(0)