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

简介: 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 根据参数清理文件夹

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

/**
     * 根据参数清理文件夹
     *
     * @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.总结

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

目录
相关文章
|
2天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
9 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
4天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
16 5
|
2天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
4天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
14 4
|
5天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
4天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
17 2
|
8天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
13天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
10天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
下一篇
无影云桌面