file_manager
file_manager copied to clipboard
Java文件管理器,支持文件树和文件列表,支持文件夹创建、删除、复制、粘贴、加密解密、压缩解压。
设计思想
MVC
设计模式
本项目引入mvc
设计模式。
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
Java swing
的设计本身就是MVC设计的典范。在这里我们也采用MVC设计模式(尽管并不是那么贴合),与swing
本身相结合。
对我们来说,view由Java swing
负责显示,model是我们自己建立的数据结构,同时结合swing
自身的model,所有操作的具体实现由model负责,即涉及到和系统文件层的交互等,controller由我们自行创建,负责添加事件监听并做出相应的逻辑操作,对界面的多个部分进行协同配合,完成视图的更新和数据的更新。
各模块功能实现
功能实现清单
-
界面跳转:
- 后退,逐级返回到父级目录。
- 前进,按照后退的顺序依次进入子目录。
- 当前目录路径显示,输入目录地址进行跳转。
-
界面显示:
- 文件目录树显示(只显示文件夹)。
- 文件列表显示(只显示当前目录下的文件夹和文件),带有系统图标。
- 点击文件树中的结点,在文件列表同步显示。
-
选择与打开
- 支持多选,选中文件高亮显示,点击空白区域取消选中。
- 单击文件夹进入,单击文件打开应用。
-
右键选中文件
- 批量复制,包括所有子目录和文件。
- 批量压缩,格式为zip,将多个文件压缩成一个,自定义命名。
- 单文件加密,自定义加密密钥。
-
右键空白区域
- 创建文件夹,自定义命名;
- 批量粘贴,粘贴的目录不能是源文件目录的子目录;
- 批量解压,解压到当前目录下。
- 单文件解密,输入加密密钥,若密钥不正确,加密后的文件仍无法打开。
类的设计
采用MVC设计模式。
package view
-
class App
-
总的界面窗口UI,继承自
JFrame
类,采用Border-layout布局。 -
工具栏
toolbar
位于上方,实现后退、前进、当前文件路径显示和路径跳转。 -
左侧是文件树,中部是文件显示区域。
-
实现对应的
addListener
函数,如:public void addUndoListener(ActionListener undo){ undoButton.addActionListener(undo); } public void addRedoListener(ActionListener redo){ redoButton.addActionListener(redo); }
-
-
class FileDisplay
- 文件主显示区,继承自
JList
,以文件列表的形式显示。 - 内嵌了
JPopMenu
,添加JMenuItem
,用以实现功能。 - 实现
updateView
函数,更新视图。 - 实现对应的
addListener
函数,添加事件监听。
- 文件主显示区,继承自
-
class FilesTree
- 文件目录树,继承自
JTree
。 - 实现了
loadingTree
函数,更新视图。 - 实现对应的
addListener
函数,添加事件监听。
- 文件目录树,继承自
-
class FileListCellRenderer
- 文件列表渲染类,继承自
DefaultListCellRenderer
。
- 文件列表渲染类,继承自
package model
-
class FileModel
- 文件实体类,具体实现了文件管理的各个功能。
-
class FileTreeModel
- 对应于文件树。
package controller
-
class FileController
-
包含了
private App app; // 窗体UI private FileDisplay fileDisplay; // 为了方便调用,内部存储 private FilesTree filesTree; // 为了方便调用,内部存储 private FileModel fileModel; // File Model private FileTreeModel treeModel; // Tree Model
-
初始化的时候,由
model
,view
参数:public FileController(App app, FileModel fileModel, FileTreeModel treeModel)
-
实现了对应的事件监听类接口,添加方法。
-
调用
model
和view
实现。
-
package util
-
class FileCode 文件加密工具类
-
class FileCopy 文件复制工具类
-
class FileIconCreate 系统图标工具类
-
class FileZip 文件压缩工具类
算法设计
主要是FileModel
的实现
-
数据记录
- 由
List<File> defaultListModel
和File currentFile
负责记录当前目录和目录下的文件、文件夹。
- 由
-
初始化
-
initRoots
方法,将磁盘目录,如C:\
,D:\
,E:\
添加进文件列表。
-
-
文件更新
-
updateModels(File file)
方法,将当前文件设为file
,并将其当前目录层级下的文件(夹)添加进文件列表。
-
-
前进和后退
- 由
redoStack
负责记录操作路径,undo时,得到父级目录下文件和文件夹,更新文件列表,并将文件压入redoStack
。 - redo时,弹出栈顶文件,更新当前文件列表。
- 细节,如果父级为
null
,说明当前是磁盘根目录,如D:\
,则调用初始化方法initRoots
。
- 由
-
文件复制
- 由
copySources
负责存储粘贴板中的文件。 - 选中文件后,加入到
copySources
中。 - 粘贴时,判断是文件,还是文件夹
- 如果是文件,则进行文件复制。
- 如果是文件夹,递归调用。
- 异常处理,粘贴的目录不能是源目录的子目录,由
isParent
进行判断。
- 由
-
创建和删除
- 如果不存在,则创建。
- 递归删除,由
deleteHelp
负责递归,如果删除的是文件夹,就递归调用,最终删除根文件。 - 对选中的文件遍历执行,批量删除。
-
压缩和解压
- 对于文件,直接压缩。
- 对于文件夹,递归压缩。
-
文件加密和解密
- 对文件读取字节内容,与密钥进行简单的异或加密。
- 加密后得到新文件,删除原始文件,并将新文件重命名为原文件。(也可以不删除,防止出问题,重要文件)
- 解密的时候,与加密过程相同,输入密钥,读取文件,异或解密。
-
取消选中
-
重写
locationToIndex
函数,判断点击的位置是否有效int index = super.locationToIndex(location); if (index != -1 && !getCellBounds(index, index).contains(location)) return -1;
-
-
样式渲染
- 实现
FileListCellRenderer
类继承DefaultListCellRenderer
- 设置图标,设置显示信息,磁盘根目录使用
getPath()
,其他目录使用getName()
。 - 选中设置颜色,取消选中恢复之前的颜色。
- 实现
-
文件树展开
- 实现
TreeSelectionListener
接口,采用延迟加载,即每次点击展开时再加载目录文件。
- 实现
软件调试分析
执行过程
-
启动
App
类的main
函数 -
在
FileController
初始化的时候,完成对数据成员的初始化,包括添加事件监听,更新初始视图。public FileController(App app, FileModel fileModel, FileTreeModel treeModel) { this.fileDisplay = app.getFileDisplay(); this.app = app; this.fileModel = fileModel; this.filesTree = app.getFilesTree(); this.treeModel = treeModel; // 添加事件监听 fileDisplay.addCopyListener(new CopyListener()); fileDisplay.addCreateListener(new CreateFileListener()); fileDisplay.addPasteListener(new PasteListener()); fileDisplay.addUnzipListener(new UnZipListener()); fileDisplay.addZipListener(new ZipListener()); fileDisplay.addDeleteListener(new DeleteListener()); fileDisplay.addMyMouseListener(new FileClickListener()); fileDisplay.addEncodeListener(new EncodeListener()); fileDisplay.addDecodeListener(new DecodeListener()); app.addUndoListener(new UndoListener()); app.addRedoListener(new RedoListener()); app.addGoListener(new GoListener()); filesTree.addTreeSelectionListener(new FileTreeSelListener()); filesTree.setRootVisible(false); // 初始化主视图 fileDisplay.updateView(fileModel.getDefaultListModel()); }
-
监听到事件发生,调用
model
和view
进行逻辑实现并更新视图。例如,展开文件目录树时,需要对三部分视图进行更新(文件树,文件列表,url地址栏)class FileTreeSelListener implements TreeSelectionListener { @Override public void valueChanged(TreeSelectionEvent e) { File file = filesTree.getCurrentFile(); // 得到点击的文件结点 // 加载目录树 filesTree.loadingTree((DefaultMutableTreeNode) filesTree.getLastSelectedPathComponent(), treeModel.getFiles(file)); // 更新文件数据模型 fileModel.updateModels(file); // 更新文件列表视图 fileDisplay.updateView(fileModel.getDefaultListModel()); // 更新url地址显示 String url = fileModel.getUrl(); app.updateUrl(url); } }
再如,undo操作时,
model
进行undo,更新数据,然后视图更新class UndoListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { fileModel.undo(); // 数据模型更新 fileDisplay.updateView(fileModel.getDefaultListModel()); // 列表视图更新 String url = fileModel.getUrl(); app.updateUrl(url); // url地址栏更新 } }
界面展示
主界面

- 上侧可以后撤、前进,url地址栏显示
- 左侧目录树展开,并同步更新右侧文件列表
文件及文件夹拷贝

右键粘贴,将子目录下所有文件(夹)粘贴
解压压缩

文件加密
(以整数int
类型为密钥,加密需要等待一些时间)
解密后,检查是否可以正常打开.
**注:**对文件夹进行加密是无效的
其他
见项目