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