diff --git a/pom.xml b/pom.xml index 3a357eb..deeaf57 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,14 @@ org.junit.jupiter junit-jupiter - 5.8.2 + 5.9.0 test + + org.apache.commons + commons-compress + 1.21 + diff --git a/src/main/java/com/simaek/util/BZip2Utils.java b/src/main/java/com/simaek/util/BZip2Utils.java new file mode 100644 index 0000000..a5e8110 --- /dev/null +++ b/src/main/java/com/simaek/util/BZip2Utils.java @@ -0,0 +1,204 @@ +package com.simaek.util; + +import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream; +import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream; + +import java.io.*; + +/** + * BZip2文件解压缩工具 + * + * @author Yaser Hsueh + */ +@SuppressWarnings({"ResultOfMethodCallIgnored", "unused"}) +public abstract class BZip2Utils { + private static final int BUFFER = 8; + private static final String EXT_SUFFIX = ".bz2"; + + + /** + * 对字节数据进行压缩 + * + * @param data 原始字节数据 + * @return 压缩后的字节数据 + * @throws IOException 数据读写异常 + */ + public static byte[] compress(byte[] data) throws IOException { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + compress(byteArrayInputStream, byteArrayOutputStream); + byteArrayOutputStream.flush(); + byteArrayOutputStream.close(); + byteArrayInputStream.close(); + return byteArrayOutputStream.toByteArray(); + } + + /** + * 对数据流进行压缩 + * + * @param is 压缩前的数据输入流 + * @param os 压缩后的数据输出流 + * @throws IOException 数据流读写异常 + */ + public static void compress(InputStream is, OutputStream os) throws IOException { + BZip2CompressorOutputStream bzip2OS = new BZip2CompressorOutputStream(os, 8); + int count; + byte[] data = new byte[BUFFER]; + while ((count = is.read(data, 0, data.length)) != -1) { + bzip2OS.write(data, 0, count); + } + bzip2OS.finish(); + bzip2OS.flush(); + bzip2OS.close(); + } + + /** + * 对文件进行压缩 + * + * @param file 待压缩的文件 + * @param delete 压缩完成后删除源文件 + * @throws IOException 文件读写异常 + */ + public static void compress(File file, boolean delete) throws IOException { + if (!file.exists()) { + throw new FileNotFoundException("源文件不存在"); + } + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(file.getPath() + EXT_SUFFIX); + compress(fis, fos); + fis.close(); + fos.flush(); + fos.close(); + if (delete) { + file.delete(); + } + } + + /** + * 对文件进行压缩,压缩完成后删除源文件 + * + * @param file 待压缩的文件 + * @throws IOException 文件读写异常 + */ + public static void compress(File file) throws IOException { + compress(file, true); + } + + /** + * 对指定路径的文件进行压缩 + * + * @param path 待压缩的文件路径 + * @param delete 压缩完成后删除源文件 + * @throws IOException 文件读写异常 + */ + public static void compress(String path, boolean delete) throws IOException { + File file = new File(path); + compress(file, delete); + } + + /** + * 对指定路径的文件进行压缩,压缩完成后删除源文件 + * + * @param path 待压缩的文件路径 + * @throws IOException 文件读写异常 + */ + public static void compress(String path) throws IOException { + compress(path, true); + } + + /** + * 对字节数据进行解压 + * + * @param data 压缩过的字节数据 + * @return 解压后的字节数据 + * @throws IOException 数据读写异常 + */ + public static byte[] uncompress(byte[] data) throws IOException { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + uncompress(byteArrayInputStream, byteArrayOutputStream); + byteArrayInputStream.close(); + return byteArrayOutputStream.toByteArray(); + } + + /** + * 对数据流进行解压 + * + * @param is 压缩后的数据输入流 + * @param os 解压后的数据输出流 + * @throws IOException 数据流读写异常 + */ + private static void uncompress(InputStream is, OutputStream os) throws IOException { + /* + * 对于多个合并的bz2输入流 + * BZip2CompressorInputStream decompressConcatenated: + * if true, decompress until the end of the input; + * if false, stop after the first .bz2 stream and + * leave the input position to point to the next + * byte after the .bz2 stream + */ + BZip2CompressorInputStream bzip2IS = new BZip2CompressorInputStream(is, true); + int count; + byte[] data = new byte[BUFFER]; + while ((count = bzip2IS.read(data, 0, data.length)) != -1) { + os.write(data, 0, count); + } + os.flush(); + os.close(); + bzip2IS.close(); + } + + /** + * 对文件进行解压 + * + * @param file 压缩文件 + * @param delete 解压完成后删除源文件 + * @throws IOException 文件读写异常 + */ + public static void uncompress(File file, boolean delete) throws IOException { + if (!file.exists()) { + throw new FileNotFoundException("源文件不存在"); + } + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(file.getPath().replace(EXT_SUFFIX, "")); + uncompress(fis, fos); + fis.close(); + fos.flush(); + fos.close(); + if (delete) { + file.delete(); + } + } + + /** + * 对文件进行解压,解压完成后删除源文件 + * + * @param file 压缩文件 + * @throws IOException 文件读写异常 + */ + public static void uncompress(File file) throws IOException { + uncompress(file, true); + } + + /** + * 对指定路径的文件进行解压 + * + * @param path 压缩文件路径 + * @param delete 解压完成后删除源文件 + * @throws IOException 文件读写异常 + */ + public static void uncompress(String path, boolean delete) throws IOException { + File file = new File(path); + uncompress(file, delete); + } + + /** + * 对指定路径的文件进行解压,解压完成后删除源文件 + * + * @param path 压缩文件路径 + * @throws IOException 文件读写异常 + */ + public static void uncompress(String path) throws IOException { + uncompress(path, true); + } +} diff --git a/src/test/java/com/simaek/util/BZip2UtilsTest.java b/src/test/java/com/simaek/util/BZip2UtilsTest.java new file mode 100644 index 0000000..e6126af --- /dev/null +++ b/src/test/java/com/simaek/util/BZip2UtilsTest.java @@ -0,0 +1,26 @@ +package com.simaek.util; + +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; + +/** + * 测试BZip2文件解压缩工具 + * + * @author Yaser Hsueh + */ +class BZip2UtilsTest { + + @Test + void compress() throws IOException { + String path = "/data/HS_H08_20210728_0010_B01_FLDK_R10_S0310.DAT"; + BZip2Utils.compress(new File(path)); + } + + @Test + void uncompress() throws IOException { + String path = "/data/HS_H08_20210728_0010_B01_FLDK_R10_S0310.DAT.bz2"; + BZip2Utils.uncompress(new File(path)); + } +} \ No newline at end of file