鱼C论坛

 找回密码
 立即注册
查看: 861|回复: 1

关于File类的一些问题

[复制链接]
发表于 2022-12-23 23:18:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*
此类用于对于文件或文件夹所有的内容进行初始化
* */
public class FileInit {
    String path;

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    //查询文件方法,将会返回包含文件信息的列表
    public String queryFiles() throws NoSuchAlgorithmException, IOException {
        //查询路径,构建一个File集合
        File file = new File(path);
        File[] files = file.listFiles();
        //构建一个List用于存放转化后的FileItem
        List<FileItem> fileItems = new ArrayList<>();
        //遍历files做判断
        for (File f:files){
            FileItem fileItem = new FileItem(f);
            fileItem.printFile();
            fileItems.add(fileItem);
        }
        Gson gson = new Gson();
        return gson.toJson(fileItems);
    }
    //格式化输出
    public void printFiles(String files){
        Gson gson = new Gson();
        Type type = new TypeToken<List<FileItem>>(){}.getType();
        List<FileItem> fileItems = gson.fromJson(files, type);
        // 格式化输出文件列表
        int count = 0;
        for (FileItem f :fileItems ) {
            String name;
            if (f.getFileType()==null){
                name = f.getFileName() + "/";
            }else {
                name = f.getFileName();
            }
            System.out.printf("%-40s", name);
            count++;
            if (count % 3 == 0) {
                System.out.println();
            }
        }
        System.out.println();
    }
    //更改目录命令
    public void changeDic(String addPath){
        File fileDic1 = new File(path+addPath);
        File fileDic2 = new File(addPath);
        if (addPath.equals("..")) {
            File parent = new File(path).getParentFile();
            if (parent != null) {
                this.path = parent.getPath();
            }else{
                System.out.println("上级目录不存在");
            }
        }
        else {
            if (fileDic1.exists()){
                this.path = path+addPath;
            } else if (fileDic2.exists()) {
                this.path = addPath;
            }else{
                System.out.println("输入路径非法");
            }
        }
    }
}
public class FileItem {
    private String fileName;
    private String fileHash;
    private String filePath;
    private long fileLength;
    private String fileType;

    //FileItem的构造方法
    //构建一个只需fileName和filePath的构造方法,根据是文件夹或文件自行判断是否计算哈希值,文件大小,文件类型
    public FileItem(String fileName,String filePath) {
        this.fileName = fileName;
        this.filePath = filePath;
        File file =new File(this.filePath+"/"+this.fileName);
        if (file.isFile()){
            try {
                //通过file内置方法获取文件大小
                this.fileLength = file.length();
                // 定义正则表达式,用于提取文件名的后缀
                String regex = "\\.(\\w+)$";
                // 编译正则表达式
                Pattern pattern = Pattern.compile(regex);
                // 创建一个Matcher对象
                Matcher matcher = pattern.matcher(fileName);
                // 如果匹配成功
                if (matcher.find()) {
                    // 获取文件名的后缀
                    this.fileType = matcher.group(1);
                }else{
                    this.fileType = null;
                }
                //通过调用FileHash方法计算文件的Hash值
                this.fileHash=FileHash(file.getPath());
                System.out.printf(fileHash);
                System.out.print("\n");
            } catch (NoSuchAlgorithmException | IOException e) {
                throw new RuntimeException(e);
            }
        }else{
            this.fileName=fileName;
            this.fileLength=0;
            this.fileType = null;
            this.fileHash=null;
        }
    }

    //构建一个只需要json文件的构造方法
    public FileItem(String json){
        Gson gson = new Gson();
        FileItem fileItem = gson.fromJson(json,FileItem.class);
        this.fileName=fileItem.getFileName();
        this.filePath=fileItem.getFilePath();
        this.fileHash=fileItem.getFileHash();
        this.fileLength=fileItem.getFileLength();
        this.fileType=fileItem.getFileType();
    }

    //实现FileItem和File类的相互转化
    public File toFile(){
        return new File(this.filePath+"/"+this.fileName);
    }

    public FileItem(File file) throws NoSuchAlgorithmException, IOException {
        FileItem fileItem = new FileItem(file.getName(),file.getPath());
        this.fileName=fileItem.getFileName();
        this.filePath=fileItem.getFilePath();
        this.fileHash=fileItem.getFileHash();
        this.fileLength=fileItem.getFileLength();
        this.fileType=fileItem.getFileType();
    }

    //展示FileItem相关信息
    public void printFile(){
        if (fileType==null){
            System.out.println(fileName+"是文件夹");
        }else {
            System.out.println(fileName+"是"+fileType+"文件");
        }
        double fileLenOp=(double)fileLength;
        //不同的文件大小采用不同的输出方式
        if(fileLength<=1024*1024){
            System.out.printf("文件大小为:%.3fKB\n",fileLenOp/1024);
        } else if ((fileLength<1024*1024*1024)) {
            System.out.printf("文件大小为:%.3fMB\n",fileLenOp/1024/1024);
        }else {
            System.out.printf("文件大小为:%.3fGB\n",fileLenOp/1024/1024/1024);
        }
        System.out.println("文件哈希为:"+fileHash);
    }


    //FileItem的Getter和Setter方法

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getFileHash() {
        return fileHash;
    }

    public void setFileHash(String fileHash) {
        this.fileHash = fileHash;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public long getFileLength() {
        return fileLength;
    }

    public void setFileLength(long fileLength) {
        this.fileLength = fileLength;
    }

    public String getFileType() {
        return fileType;
    }

    public void setFileType(String fileType) {
        this.fileType = fileType;
    }
}
在FileInit这个类中的queryFiles()方法中,遍历files里的每个元素f,这个f的f.isFile()始终都是false是为什么呢?
注释掉有关FileItem的内容后就会f.isFile就会正常,但是只要由FileItem的内容就始终为false.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-5 16:24:17 | 显示全部楼层
看不出你的设参,你可以打断点看下File file =new File(this.filePath+"/"+this.fileName); 这个地方  括号内应该是一个文件路径,路径里面有文件类型。如果路径不对或者没有文件类型都会返回false。
问题如果解决了,请告知我,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表