百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Apache commons,让你的java鸟枪换炮(二)——文件处理

lipiwang 2024-10-25 15:55 6 浏览 0 评论

大家好,我是吉森。

书接上回,我们说到Apache commons工具包为jdk补充了很多优秀的api,把jdk这把小枪改造成了大炮。上回我们介绍了这个工具包的语言部分,今天让我们一起来学习一下文件处理部分,主要包括怎么读写文件、怎么压缩文件以及怎么处理csv格式的文件。

先来看一下这一部分的思维导图。

文件读写

Apache commons工具包中处理文件读写的模块是commons-io,其中最常用的工具包为IOUtils和FileUtils。IOUtils主要用于读写文件内容,如将文件内容读为字符串,或按行读为字符串列表。而FileUtils主要用于处理整个文件或文件夹,如移动、复制文件,或清理文件夹等。

// 拷贝大文件
final Path path = Paths.get(IOTest.class.getResource("/").toURI()).resolve("web2.properties");
IOUtils.copyLarge(IOTest.class.getResourceAsStream("/web.properties"),
        Files.newOutputStream(path));

// 将输入流读取为字符串列表
final List<String> lines = IOUtils.readLines(IOTest.class.getResourceAsStream("/web.properties"));

// 将输入流读取为行的迭代器
final LineIterator lineIterator = IOUtils.lineIterator(IOTest.class.getResourceAsStream("/web.properties"), Charset.defaultCharset());

// 将classpath下的资源读取为字符串
final String resource = IOUtils.resourceToString("/web.properties", Charset.defaultCharset());

// 将字符串列表写入文件,覆盖原有文件
FileUtils.writeLines(new File("a.txt"), List.of("abc", "123", "456"));

// 拷贝文件夹,将源文件夹内所有文件复制到目标文件夹中
FileUtils.copyDirectory(new File("test"), new File("test4"));

// 清空某文件夹中的内容,保留文件夹
FileUtils.cleanDirectory(new File("test2"));

// 删除文件夹及其中的内容
FileUtils.deleteDirectory(new File("test3"));

// 强制创建多层级文件夹结构
FileUtils.forceMkdir(new File("s/b/c/d"));

// 移动文件夹
FileUtils.moveDirectory(new File("test4"), new File("test5"));

文件压缩

处理文件压缩的工具包是commons-compress,它可以处理tar、zip、gzip、bzip2、7z、jar等常见的压缩格式。

这里以tar文件的打包和解包或tar.gz的压缩和解压文件为例,看看是怎么处理压缩文件的,其他格式的处理方式类似。

public class CompressTest {
    public static void main(String[] args) {

        /* 创建压缩/归档文件 */
        // 创建压缩文件输出流,true代表需要进行压缩,即tar.gz格式,false代表只需要打包,即tar格式。
        try (ArchiveOutputStream output = getArchiveCompressOutputStream("test.tar.gz", true)) {
            // 遍历文件夹中的所有文件
            final List<File> fileList = Files.walk(Paths.get("test")).map(Path::toFile).collect(Collectors.toList());
            for (File f : fileList) {
                // 创建文件在压缩包中的入口
                final ArchiveEntry entry = output.createArchiveEntry(f, f.getPath());
                output.putArchiveEntry(entry);
                if (f.isFile()) {
                    try (InputStream i = Files.newInputStream(f.toPath())) {
                        IOUtils.copy(i, output);
                    }
                }
                output.closeArchiveEntry();
            }
            output.finish();
        } catch (IOException | ArchiveException e) {
            e.printStackTrace();
        }


        /* 读取压缩/归档文件 */
        Path targetDir = Paths.get("test6");

        // 创建压缩文件输入流,true代表需要进行压缩,即tar.gz格式,false代表只需要打包,即tar格式。
        try (ArchiveInputStream inputStream = getArchiveCompressInputStream("test.tar.gz", true)) {

            // 遍历压缩包中的入口
            ArchiveEntry entry;
            while ((entry = inputStream.getNextEntry()) != null) {
                if (!inputStream.canReadEntryData(entry)) {
                    continue;
                }
                Path path = targetDir.resolve(entry.getName());
                // 创建文件夹或拷贝文件
                if (entry.isDirectory()) {
                    if (!Files.isDirectory(path)) {
                        Files.createDirectories(path);
                    }
                } else {
                    Files.createDirectories(path.getParent());
                    Files.copy(inputStream, path);
                }
            }
        } catch (ArchiveException | IOException e) {
            e.printStackTrace();
        }
    }


    public static ArchiveInputStream getArchiveCompressInputStream(String filename, boolean gzip)
            throws IOException, ArchiveException {
        InputStream is;
        // 判断是否压缩,如果是tar.gz文件,需要嵌套压缩流
        if (gzip) {
            is = new GzipCompressorInputStream(new FileInputStream(filename));
        } else {
            is = new FileInputStream(filename);
        }
        return new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.TAR, is);
    }

    public static ArchiveOutputStream getArchiveCompressOutputStream(String filename, boolean gzip)
            throws IOException, ArchiveException {
        OutputStream os;
        // 判断是否压缩,如果是tar.gz文件,需要嵌套压缩流
        if (gzip) {
            os = new GzipCompressorOutputStream(new FileOutputStream(filename));
        } else {
            os = new FileOutputStream(filename);
        }
        return new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.TAR, os);
    }
}

处理csv文件

处理csv的工具包是commons-csv,它可以处理默认格式的CSV文件,也可以处理带各种特定格式文件头的CSV文件,如excel、mysql、oracle的csv文件。

这里以默认格式的CSV文件为例,看一下CSV文件的读写。带文件头的文件只需要做少量的额外处理即可。

 // 写入CSV文件
try (CSVPrinter printer = new CSVPrinter(new PrintWriter("test.csv"), CSVFormat.DEFAULT)) {
    List<String> titleLine = List.of("name", "age", "gender");
    List<List<String>> values = List.of(
            List.of("张三", "20", "男"),
            List.of("李四", "21", "女"),
            List.of("王五", "22", "男")
    );
    // 输出一条记录
    printer.printRecord(titleLine);
    // 输出多条记录
    printer.printRecords(values);
}

// 读取CSV文件
// 配置CSV带标题行
try (CSVParser parser = new CSVParser(Files.newBufferedReader(Paths.get("test.csv")), CSVFormat.DEFAULT.withHeader())) {
    // 可以通过标题来获取值
    for (CSVRecord record : parser) {
        System.out.print(record.get("name") + "|");
        System.out.print(record.get("age") + "|");
        System.out.println(record.get("gender"));
    }
}

引入相关的jar包

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.8</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.20</version>
</dependency>

总结

今天我们一起学习了怎么利用Apache commons工具包高效地处理文件,包括如何进行文件读写、如何压缩及解压文件以及如何处理CSV格式的文件。

今天就介绍到这里了,如果本文对你有帮助,欢迎转发点赞关注~

相关推荐

前端 JavaScript 字符串中提取数字

varstr="4500元";varnum=parseInt(str);alert(num);//4500如果字符串前面有非数字字符,上面这种方法就不行了:var...

使用JavaScript如何获取网站网址(js如何获取浏览器信息)

在做网站开发时,我们有时候会获取当前页面的完整路径。在网页前端如何实现呢?请在网页脚本代码段中粘贴如下代码。functiongetRootPath(){//获取当前网址,...

java文本对比工具源码8(java比较文本相似度)

/***ParseatextualrepresentationofpatchesandreturnaListofPatch*objects.*@paramtextline...

JavaScript实现的9大排序算法(js排序方法)

笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现。1、插入排序1)算法简介插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通...

使用函数化的Javascript代码编写方式

对于Javascript介绍想必大家都耳熟能详啦,基于函数化的编程语言,基于浏览器运行的编程语言,web开发语言,前端开发必备语言,blablabla...Javascript是一个非常灵...

Js基础31:内置对象(js内置对象是什么意思)

js里面的对象分成三大类:内置对象ArrayDateMath宿主对象浏览器提供的对象(如bom、dom等等)自定义对象开发人员自己定义的对象内置对象——所谓内置对象,就是JavaScript自...

js获取上传文件类型以及大小的方法

前端web上传文件时,需要在上传之前判断一下文件的类型以及文件的大小,HTML为前端的标记语言是无法做到这一点,只能使用javascript动态脚本代码来实现。js获取上传文件大小的方法示例代码:&...

黑客入门实践:如何绕过前端过滤上传文件

今天开始,我们就要开始学习具体的漏洞了,但是希望大家学完后,不要轻易"入侵"网站哦,当时测试环境下除外。今天的课程是关于“文件上传漏洞”,据安界网的老师介绍,文件上传漏洞仅次于命令执行...

Java文件上传细讲(java文件夹上传)

什么是文件上传?文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。免费学习资料获取方式上传组件(工具)为什么我们要使用上传工具...

鸿蒙上实现“翻译”功能(鸿蒙宴全文翻译)

本章节我们来制作中文翻译成英文的实例(运行在HarmonyOS上),通过HTTP去配合API进行实现。需求分析如下:文字输入HTTP协议使用文字翻译控件介绍①HTTP数据请求官方文档请求...

JavaScript从入门到精通(javascript 入门教程)

前几天,我们学习了JavaScript的入门课程,但是要想做网站,仅仅学会入门是不够的,今后的几天,我将带领大家精通JavaScript,希望大家好好学习!JS内置对象String对象:字符串对象,提...

第15天|16天搞定前端,javascript语法篇(干货)

JavaScript是互联网上最流行的脚本语言,这门语言可用于HTML和web,可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。它是一个脚本语言,它是一个轻量级,但功能强大的编程...

通过js来实现打字效果(js如何输入)

有时候浏览网页经常会看见一些页面出现一些打字的效果,那么是怎么实现的呢?逻辑确定目标容器,在哪个容器进行输出确定输出内容,当前直接根据目标容器确定输出内容即可需要控制输出频率,因此需要循环输出完毕代码...

手把手教你学会一键还原混淆js原理

1.短变量名在以下示例代码中,我们将变量“customerName”替换为“a”:vara="JohnSmith";console.log(a);2.随机变量名在以下示例代码...

sql中常用的字符串函数详解(sql字符串函数有哪些)

在日常开发中遇到处理最多的可能字符串要算其中一个了,什么替换啊截取啊大小写转换啊、删除空格啊等等,这些操作我们可以在前端操作,也可以直接在数据库的sql中操作,那么我们来看一下sql中处理字符串的...

取消回复欢迎 发表评论: