如果超过,将所有文件拆分成多份(拆分方法我要求是均等分,先按照文件大小对每个文件进行排序,然后再将文件依次分发给给文件夹),使得我每份文件总大小不超过上限。再将各文件夹达成zip压缩包,名称加上数字后缀。怎么用JAVA语言的List<Map<String,List>>结果实现
时间: 2023-12-24 21:04:38 浏览: 117
JAVA实现多个文件压缩为一个zip文件
5星 · 资源好评率100%
可以按照以下的思路来实现:
1. 首先需要将所有文件按照大小进行排序,可以使用Java自带的File类来获取文件大小,并使用Collections.sort()方法对文件列表进行排序。
2. 然后根据每份文件的总大小上限,计算出需要拆分成几份。
3. 接下来,可以使用一个List<Map<String, List>>来存储所有拆分后的文件夹信息,其中List表示文件夹中的文件列表,Map表示文件夹的属性信息,比如文件夹名称、大小等。
4. 对于每个文件夹,可以使用一个循环来依次将文件添加到文件夹中,直到文件夹大小达到上限。然后将该文件夹信息添加到List中,并清空文件夹,继续处理下一个文件夹。
5. 最后,将每个文件夹打包成zip压缩包,并加上数字后缀作为文件名。
下面是代码示例,仅供参考:
```
import java.io.*;
import java.util.*;
public class FileSplitter {
public static void main(String[] args) {
String dirPath = "path/to/folder"; // 待拆分的文件夹路径
long maxSize = 1024 * 1024 * 100; // 每份文件的最大大小(这里以100MB为例)
// 获取文件列表并按照大小排序
File[] files = new File(dirPath).listFiles();
Arrays.sort(files, Comparator.comparingLong(File::length));
// 计算需要拆分成几份
int numFolders = (int) Math.ceil((double) getTotalSize(files) / maxSize);
// 拆分文件夹
List<Map<String, List<File>>> folders = new ArrayList<>();
for (int i = 0; i < numFolders; i++) {
long folderSize = 0;
Map<String, List<File>> folder = new HashMap<>();
folder.put("files", new ArrayList<>());
while (folderSize < maxSize && !isEmpty(files)) {
File file = files[0];
long fileSize = file.length();
if (folderSize + fileSize > maxSize) {
break;
}
folder.get("files").add(file);
folderSize += fileSize;
files = Arrays.copyOfRange(files, 1, files.length);
}
folder.put("name", Collections.singletonList("folder_" + (i + 1)));
folder.put("size", Collections.singletonList(folderSize));
folders.add(folder);
}
// 打包文件夹
for (int i = 0; i < folders.size(); i++) {
Map<String, List<File>> folder = folders.get(i);
String folderName = folder.get("name").get(0);
List<File> fileList = folder.get("files");
try {
FileOutputStream fos = new FileOutputStream(folderName + ".zip");
ZipOutputStream zos = new ZipOutputStream(fos);
for (File file : fileList) {
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
fis.close();
zos.closeEntry();
}
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 计算文件列表的总大小
private static long getTotalSize(File[] files) {
long totalSize = 0;
for (File file : files) {
totalSize += file.length();
}
return totalSize;
}
// 判断文件列表是否为空
private static boolean isEmpty(File[] files) {
return files == null || files.length == 0;
}
}
```
在上述代码中,List<Map<String, List<File>>> folders就是存储所有拆分后的文件夹信息的数据结构。其中,Map中的"files"键对应的值是该文件夹中的所有文件列表,"name"键对应的值是文件夹名称,"size"键对应的值是文件夹大小。在打包文件夹时,使用ZipOutputStream类将文件列表中的所有文件压缩到一个zip文件中。
阅读全文