网站首页 > java教程 正文
大家好,我是吉森。
书接上回,我们说到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格式的文件。
今天就介绍到这里了,如果本文对你有帮助,欢迎转发点赞关注~
猜你喜欢
- 2024-09-30 SQL SERVER 清理日志文件的方法(sql server怎么清除日志)
- 2024-09-30 如何使用 Java 在 PDF 文档中添加、删除或旋转页面
- 2024-09-30 夯实基础:完全理解掌握Java文件类File
- 2024-09-30 Java基础——IO流(10)(java基础)
- 2024-09-30 Java编程思想:清除一收尾和垃圾收集
- 2024-09-30 Java教程Java 文件 IO 操作(java io写文件)
- 2024-09-30 近2万字详解JAVA NIO2文件操作,过瘾
- 2024-09-30 JAVA运维必备——linux的基本常见命令,也是“装逼”命令
- 2024-09-30 Java中常用IO流之文件流的基本使用姿势
- 2024-09-30 Java平台的海量小文件分布式文件系统BRFS-全套源码+文档
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)