Java【代码 15】文件操作相关方法(获取文件、复制文件、创建文件夹、获取图片文件、写出数据到文件、清理文件夹)

1.说明

这个是一个文件操作相关的工具类方法分享,主要是有一些小的点:

  • 最新文件不扫码
  • 写出文件使用固定编码

2.工具详情

方法可能并不通用,特别是最后的根据参数清理文件夹,里边有专门对文件夹路径的判断。

2.1 根据路径获取指定数量的文件列表

此方法会扫码rootPath下的所有文件,根据fileCount获取指定数量的文件:

  • 可添加对文件的筛选(根据文件名称包含某些字符串)
  • 不能用在多线程的场景
    private List<File> files = new ArrayList<>();

    /**
     * 根据路径获取指定数量的文件列表
     *
     * @param rootPath  目录
     * @param fileCount 数量
     * @return 文件列表
     */
    public List<File> getFiles(String rootPath, int fileCount) {
    
    
        List<File> fileList = new ArrayList<>();
        Path rootDir = Paths.get(rootPath);
        try {
    
    
            DirectoryStream<Path> paths = Files.newDirectoryStream(rootDir);
            for (Path path : paths) {
    
    
                File file = path.toFile();
                if (file.isDirectory()) {
    
    
                    fileList.addAll(getFiles(file.getAbsolutePath(), fileCount - fileList.size()));
                } else {
    
    
                    if (files.contains(file)) {
    
    
                        continue;
                    }
                    if (System.currentTimeMillis() - file.lastModified() < 10000) {
    
    
                        continue;
                    }
                    files.add(file);
                    fileList.add(file);
                }
                if (fileList.size() >= fileCount) {
    
    
                    break;
                }
            }
            paths.close();
            files.clear();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return fileList;
    }

2.2 复制文件

这个是非常常用的方法。

    /**
     * 复制文件
     *
     * @param sourceFile 源文件
     * @param targetFile 目标文件
     * @return 是否复制成功
     */
    public boolean fileCopyToNewFile(File sourceFile, File targetFile) {
    
    
        boolean success = false;
        try {
    
    
            FileUtils.copyFile(sourceFile, targetFile);
            success = true;
        } catch (IOException e) {
    
    
            e.printStackTrace();
            log.error("fileCopyToNewFile Failed!");
        }
        return success;
    }

2.3 根据参数创建文件夹

非常常用,不再解释。

    /**
     * 根据参数创建文件夹
     *
     * @param dirPath  文件夹路径
     * @param describe 文件夹描述
     */
    public void creatDirByParam(String dirPath, String describe) {
    
    
        // 获取文件夹路径
        File file = new File(dirPath);
        // 判断文件夹是否创建,没有创建则创建新文件夹
        if (!file.exists()) {
    
    
            if (file.mkdirs()) {
    
    
                log.info(" - - - - - - 创建{} [{}] - - - - - - ", describe, dirPath);
            }
        }
    }

2.4 根据图片路径获取图片

根据图片路径将图片展示在浏览器。

    /**
     * 根据图片路径获取图片
     *
     * @param imagePath 图片路径
     * @return 图片数据
     */
    public ResponseEntity<byte[]> getImageByPath(String imagePath) {
    
    
        File file = new File(imagePath);
        byte[] imageBytes = {
    
    };
        try {
    
    
            imageBytes = Files.readAllBytes(file.toPath());
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.IMAGE_JPEG);
        return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);
    }

调用方法:

    @GetMapping(value = "/getImageByImagePath", produces = "application/json;charset=UTF-8")
    public Map<String, Object> getImageByImagePath(String pic) {
    
    
        return getImageByImagePath(pic);
    }

2.5 根据参数输出文件

使用固定的编码格式输出文件。

    /**
     * 根据参数输出文件
     *
     * @param filePath 文件路径
     * @param data     数据对象
     * @param size     写出的条数
     */
    public static void writeDataToFile(String filePath, LinkedBlockingQueue<String> data, int size) {
    
    
        try {
    
    
            // 创建 BufferedWriter 对象,提高写入性能
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), StandardCharsets.UTF_8));
            // 写入数据
            for (int i = 0; i < size; i++) {
    
    
                bufferedWriter.write(data.take());
                if (i < size - 1) {
    
    
                    // 写入换行符
                    bufferedWriter.newLine();
                }
            }
            // 关闭资源
            bufferedWriter.close();
            log.info("------writeDataToFile [{}] 条!------", size);
        } catch (IOException | InterruptedException e) {
    
    
            log.error("------writeDataToFile Failed [{}]------", e.getMessage());
        }
    }

2.6 根据参数清理文件夹

当前方法有特定的判断,不是通用方法。

扫描二维码关注公众号,回复: 16771906 查看本文章
    /**
     * 根据参数清理文件夹
     *
     * @param rootPath 根目录
     * @param keepDays 保存日期
     */
    public void deleteFolderByParam(String rootPath, int keepDays) {
    
    
        try {
    
    
            String currentDay = DateUtil.format(DateUtil.offsetDay(new Date(), -keepDays), "yyyyMMdd");
            int currentDayInt = Integer.parseInt(currentDay);
            File[] devPathArr = new File(rootPath).listFiles();
            if (devPathArr != null && devPathArr.length > 0) {
    
    
                for (File devPath : devPathArr) {
    
    
                    if (devPath.isDirectory()) {
    
    
                        File[] dayPathArr = devPath.listFiles();
                        if (dayPathArr != null && dayPathArr.length > 0) {
    
    
                            for (File dayPath : dayPathArr) {
    
    
                                if (dayPath.isDirectory()) {
    
    
                                    int dirName = Integer.parseInt(dayPath.getName());
                                    if (dirName < currentDayInt) {
    
    
                                        File[] files = dayPath.listFiles();
                                        if (files != null && files.length > 0) {
    
    
                                            for (File file : files) {
    
    
                                                FileUtils.delete(file);
                                                log.info("deleteFolder[{}]file[{}]", dirName, file.getName());
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
    
    
            log.error("deleteFolderByParam Failed! [{}]", e.getMessage());
        }
    }

3.总结

文件相关的操作是很常用的,会不断进行补充。

猜你喜欢

转载自blog.csdn.net/weixin_39168541/article/details/131601155
今日推荐