快捷搜索:  汽车  科技

apache 常用java包(Apachecommons让你的java鸟枪换炮)

apache 常用java包(Apachecommons让你的java鸟枪换炮)// 写入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

大家好,我是吉森。

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

apache 常用java包(Apachecommons让你的java鸟枪换炮)(1)

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

apache 常用java包(Apachecommons让你的java鸟枪换炮)(2)

文件读写

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格式的文件。

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

apache 常用java包(Apachecommons让你的java鸟枪换炮)(3)

猜您喜欢: