java做一个简单的文件管理器(一)

时间:2021-11-12 21:08:15

前言

马上大四了,在大三结束后进入一家国企的研发组工作,短短的两个月实习大部分时间都是在自己学习。最近几天突然有点困倦,决定把之前做的一些东西分享出来。

目的与内容

运用面向对象程序设计思想,基于Java文件管理和I/O框架,实现基于图形界面的GUI文件管理器。
1、实现文件夹创建、删除、进入。
2、实现当前文件夹下的内容罗列。
3、实现文件拷贝和文件夹拷贝(文件夹拷贝指深度拷贝,包括所有子目录和文件)。
4、实现指定文件的加密和解密。
5、实现指定文件和文件夹的压缩。
6、实现压缩文件的解压。
7、文件管理器具有图形界面。


分析

平时都是在使用系统的资源管理器,突然自己写一个会感到措手不及。但是当经过分层次的分析之后,会发现其实将一个文件管理器简析出来之后,会发现脉络特别清晰。因为实际上你真正要操作的是一个字符串,而它代表的就是具体的文件或文件夹。

  1. 界面:仅仅负责展示所有尽可能可以展示的信息
  2. 操作:根据当前指定的路径来选择要做的行为
  3. 路径:这里我们只需要返回当前的路径。

如何得到我们想要操作的路径

  1. 我们需要先抽象一系列的方法,而通过这些方法,我们可以得到对于一个文件来说我们所有想要的属性:
public interface I_Node {
//获取指定索引节点文件的子文件节点
public abstract Object getChild(String fileKind, int index);
//获取指定子文件
public abstract Object getChildFile( int index) ;
//返回根节点
public abstract Object getRoot();
//获取子节点数目
public abstract int getChildCount(String fileKind);
//获取文件名
public abstract String toString();
//获取文件图标
public abstract Icon getIcon();
//判断是否是叶节点
public abstract boolean isLeaf();
//获取文件路径
public abstract String getPath();
//获取父节点
public abstract Object getParent();
//获取当前节点
public abstract Object getCurrent();
//添加孩子节点
public abstract void addChild(I_Node node);
//获取当前文件
public abstract File getFile();
//删除节点文件
public abstract void deleteChild(I_Node node);
//获取文件大小
public abstract long getSize();
//删除所有孩子节点
public abstract void removeAllChildren();
}
  1. 去实现这些方法
public class FileNode implements I_Node {//文件的一些基本的信息和对其的一些基本操作
private Vector<File> allFiles = new Vector<File>();
private Vector<File> folder = new Vector<File>();
private FileSystemView fileSystemView = FileSystemView.getFileSystemView();
private File file = null;
private long dirLenth = 0;
public FileNode() {
file = fileSystemView.getHomeDirectory();
addChildren();
}
public FileNode(File file) {
this.file=file;
addChildren();
}
//添加单个孩子文件
public void addChild(I_Node node) {
allFiles.add(node.getFile());
}
//添加多个孩子文件
private void addChildren() {
File[] fileList = fileSystemView.getFiles(file, true);
for (File file : fileList) {
allFiles.add(file);
if (file.isDirectory()
&& !file.getName().toLowerCase().endsWith(".lnk")) {
folder.add(file);
}
}
}
//根据文件类型获取孩子数
public int getChildCount(String fileKind) {
if (fileKind.equals("files")) { //所有文件
return allFiles.size();
} else if (fileKind.equals("folder")) { //文件夹类型
return folder.size();
} else {
return 0;
}
}
//根据文件类型获取指定孩子节点
public Object getChild(String fileKind, int index) {
if (fileKind.equals( "files")) {
return new FileNode(allFiles.get(index));
} else if (fileKind.equals("folder")) {
return new FileNode(folder.get(index));
} else {
return null;
}
}
//获取指定孩子文件
public Object getChildFile( int index) {
if(index<allFiles.size()){
return allFiles.get(index);
}
return null;
}
//获取父节点
public Object getParent() {
return new FileNode(file.getParentFile());
}
//获取根目录
public Object getRoot() {
return this;
}
//获取文件名
public String toString() {
return fileSystemView.getSystemDisplayName(file);
}
//获取文件图标
public Icon getIcon() {
return fileSystemView.getSystemIcon(file);
}
//判断是否是叶节点
public boolean isLeaf() {
return folder.size() == 0;
}
//获取文件路径
public String getPath() {
return this.file.getPath();
}
//获取当前节点
public Object getCurrent() {
return this;
}
//获取当前文件
public File getFile() {
return this.file;
}
//删除指定节点
public void deleteChild(I_Node node) {
allFiles.remove(node.getFile());
}
//获取当前节点大小
public long getSize() {
if (this.getFile().isDirectory()) {
return getDirSize(this.getFile().getPath());
} else {
return getFileSize();
}
}
//获取文件大小
private long getFileSize() {
return this.getFile().length();
}
//获取文件夹大小
private long getDirSize(String dir) {
File[] fileList = new File(dir).listFiles();
for (File file : fileList) {
if (file.isDirectory()) {
getDirSize(file.getPath());
} else {
dirLenth = dirLenth + file.length();
}
}
return dirLenth;
}
//删掉所有子文件
public void removeAllChildren() {
this.allFiles.removeAllElements();
}
}

未完。。。