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

前言

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

目的与内容

运用面向对象程序设计思想,基于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();
    }
}

未完。。。

  • 19
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值