diff --git a/checkstyle.xml b/checkstyle.xml
new file mode 100644
index 0000000..a1c8b92
--- /dev/null
+++ b/checkstyle.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index d0617e2..a5c1e73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,25 +68,53 @@
org.apache.maven.plugins
maven-checkstyle-plugin
- 3.1.2
+ 3.6.0
checkstyle.xml
+ UTF-8
+ true
+
+
+ checkstyle-check
+ verify
+
+ check
+
+
+
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 4.8.6.6
+
+ Max
+ Medium
+ true
+ true
+ spotbugs-exclude.xml
+
+
+
+ spotbugs-check
+ verify
+
+ check
+
+
+
org.apache.maven.plugins
maven-javadoc-plugin
- 3.3.0
+ 3.12.0
private
true
+ none
diff --git a/spotbugs-exclude.xml b/spotbugs-exclude.xml
new file mode 100644
index 0000000..cb20c5b
--- /dev/null
+++ b/spotbugs-exclude.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/compress/compress.java b/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/compress/compress.java
index 13e8ac7..bb17cc8 100644
--- a/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/compress/compress.java
+++ b/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/compress/compress.java
@@ -52,7 +52,11 @@ public class compress {
if (entry.isDirectory()) {
Files.createDirectories(targetPath);
} else {
- Files.createDirectories(targetPath.getParent());
+ Path parent = targetPath.getParent();
+ if (parent == null) {
+ throw new IllegalArgumentException("无法确定条目父目录: " + entry.getName());
+ }
+ Files.createDirectories(parent);
Files.copy(tarIn, targetPath);
}
}
@@ -115,7 +119,11 @@ public class compress {
}
});
} else {
- TarArchiveEntry entry = new TarArchiveEntry(sourcePath, sourcePath.getFileName().toString());
+ Path fileName = sourcePath.getFileName();
+ if (fileName == null) {
+ throw new IllegalArgumentException("无法从源路径获取文件名: " + sourcePath);
+ }
+ TarArchiveEntry entry = new TarArchiveEntry(sourcePath, fileName.toString());
tarOut.putArchiveEntry(entry);
Files.copy(sourcePath, tarOut);
tarOut.closeArchiveEntry();
@@ -164,7 +172,11 @@ public class compress {
}
});
} else {
- ZipArchiveEntry entry = new ZipArchiveEntry(sourcePath.getFileName().toString());
+ Path fileName = sourcePath.getFileName();
+ if (fileName == null) {
+ throw new IllegalArgumentException("无法从源路径获取文件名: " + sourcePath);
+ }
+ ZipArchiveEntry entry = new ZipArchiveEntry(fileName.toString());
zipOut.putArchiveEntry(entry);
Files.copy(sourcePath, zipOut);
zipOut.closeArchiveEntry();
@@ -200,7 +212,11 @@ public class compress {
if (entry.isDirectory()) {
Files.createDirectories(targetPath);
} else {
- Files.createDirectories(targetPath.getParent());
+ Path parent = targetPath.getParent();
+ if (parent == null) {
+ throw new IllegalArgumentException("无法确定条目父目录: " + entry.getName());
+ }
+ Files.createDirectories(parent);
Files.copy(zipIn, targetPath);
}
}
diff --git a/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/file/EncryptionAndDecryption.java b/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/file/EncryptionAndDecryption.java
index 8665590..6384200 100644
--- a/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/file/EncryptionAndDecryption.java
+++ b/src/main/java/top/gtb520/java/gnu/java/utils/library/utils/file/EncryptionAndDecryption.java
@@ -53,6 +53,9 @@ public class EncryptionAndDecryption {
private static final String DES_ECB = "DES/ECB/PKCS5Padding";
private static final String RSA_WRAP = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding";
+ /** 共享的安全随机数发生器,避免每次加密都新建 SecureRandom 实例 */
+ private static final SecureRandom SECURE_RANDOM = new SecureRandom();
+
/**
* 文件加密。加密后覆盖原文件(原子替换),密钥保存到 keyPath 目录下,密钥名为 原文件名.key。
*
@@ -135,7 +138,7 @@ public class EncryptionAndDecryption {
private static void encryptAesGcm(File file, SecretKey key) throws Exception {
byte[] iv = new byte[GCM_IV_BYTES];
- new SecureRandom().nextBytes(iv);
+ SECURE_RANDOM.nextBytes(iv);
Cipher cipher = buildCipher(AES_GCM, Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(GCM_TAG_BITS, iv));
Path tmp = tempSibling(file);
@@ -172,7 +175,7 @@ public class EncryptionAndDecryption {
// 随机 AES-256 会话密钥,RSA-OAEP 包裹后存入文件头
SecretKey sessionKey = generateKey("AES", AES_KEY_BITS);
byte[] iv = new byte[GCM_IV_BYTES];
- new SecureRandom().nextBytes(iv);
+ SECURE_RANDOM.nextBytes(iv);
Cipher wrapCipher = Cipher.getInstance(RSA_WRAP);
wrapCipher.init(Cipher.WRAP_MODE, publicKey);
@@ -279,6 +282,9 @@ public class EncryptionAndDecryption {
*/
private static Path tempSibling(File file) throws IOException {
Path dir = file.toPath().toAbsolutePath().getParent();
+ if (dir == null) {
+ throw new IOException("无法确定文件所在目录: " + file);
+ }
return Files.createTempFile(dir, file.getName() + ".", ".tmp");
}