java 多线程压缩文件夹代码
时间: 2023-10-12 07:55:25 浏览: 44
下面是一个使用Java多线程压缩文件夹的示例代码:
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class FolderCompressor {
private static final int THREAD_POOL_SIZE = 5;
public static void main(String[] args) {
String sourceFolder = "/path/to/source/folder";
String zipFile = "/path/to/output/zip/file.zip";
compressFolder(sourceFolder, zipFile);
}
public static void compressFolder(String sourceFolder, String zipFile) {
File folderToCompress = new File(sourceFolder);
File zipOutputFile = new File(zipFile);
if (!folderToCompress.exists()) {
System.out.println("Source folder does not exist.");
return;
}
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOutputFile))) {
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
compressFolder(folderToCompress, folderToCompress.getName(), zipOutputStream, executorService);
executorService.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void compressFolder(File folder, String parentFolder, ZipOutputStream zipOutputStream, ExecutorService executorService)
throws IOException {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
compressFolder(file, parentFolder + "/" + file.getName(), zipOutputStream, executorService);
continue;
}
executorService.execute(() -> {
try (FileInputStream fileInputStream = new FileInputStream(file)) {
ZipEntry zipEntry = new ZipEntry(parentFolder + "/" + file.getName());
zipOutputStream.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fileInputStream.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, length);
}
zipOutputStream.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
```
请将`/path/to/source/folder`替换为要压缩的文件夹路径,并将`/path/to/output/zip/file.zip`替换为输出的压缩文件路径。该代码使用了固定大小的线程池来并行压缩文件夹中的文件。