mudern 发表于 2022-12-23 23:18:52

关于File类的一些问题

/*
此类用于对于文件或文件夹所有的内容进行初始化
* */
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.

一颗yan 发表于 2023-1-5 16:24:17

看不出你的设参,你可以打断点看下File file =new File(this.filePath+"/"+this.fileName); 这个地方括号内应该是一个文件路径,路径里面有文件类型。如果路径不对或者没有文件类型都会返回false。
问题如果解决了,请告知我,谢谢
页: [1]
查看完整版本: 关于File类的一些问题