gpt4 book ai didi

Java - 使用来自不同位置的多个文件和子文件夹创建 Zip 文件

转载 作者:太空宇宙 更新时间:2023-11-04 10:55:51 24 4
gpt4 key购买 nike

我正在尝试用 Java 生成一个 zip 文件,其中包含位于不同位置的多个不同类型(例如图像、字体等)的文件。此外,我希望 zip 文件具有子文件夹,其中文件按其类型放置(例如,图像应转到 zip 中的图像文件夹。

这些是我拥有的文件(每个文件可以位于不同的位置):

  • index.html
  • img1.jpg
  • img2.jpg
  • 字体1.woff
  • font2.woff
  • 样式.css
  • 自定义.js

这就是它们在 zip 文件中的样子:

  • index.html
  • 图片/img1.jpg
  • 图片/img2.jpg
  • 字体/font1.woff
  • 字体/font2.woff
  • js/custom.js
  • css/styles.css

到目前为止,我已成功获取特定路径中的一个文件并提示用户输入输出位置。将使用输入中指定的文件生成 zip 文件。这是我到目前为止的代码:

JFrame parentFrame = new JFrame();

JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Speicherort auswählen");

int userSelection = fileChooser.showSaveDialog(parentFrame);
String pathToFile;

if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
print(fileToSave.getAbsolutePath());
pathToFile = fileToSave.getAbsolutePath();
}

pathToFile = pathToFile.replace("\\", "/");

String outFileName = pathToFile;
String inFileName = "C:/Users/asoares/Desktop/mobio_export_test/index.html";
ZipOutputStream zos = null;
FileInputStream fis = null;

try {
zos = new ZipOutputStream(new FileOutputStream(outFileName));
fis = new FileInputStream(inFileName);
zos.putNextEntry(new ZipEntry(new File(inFileName).getName()));
int len;
byte[] buffer = new byte[2048];
while((len = fis.read(buffer, 0, buffer.length)) > 0) {
zos.write(buffer, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fis != null){
try {
fis.close();
} catch (IOException e) {}
}
if(zos != null){
try {
zos.closeEntry();
zos.close();
} catch (IOException e) {}
}
}

如果有人能帮助我,我会非常高兴!!!

最佳答案

它应该像这样工作。

zip 目录名称最多应该通过其他方法创建(图像类型比 jpg 更多:))。

public static Path zip(List<Path> files, Path zipFileTarget) throws IOException {
try (FileOutputStream fos = new FileOutputStream(zipFileTarget.toFile());
ZipOutputStream zos = new ZipOutputStream(fos)) {
if (!Files.exists(zipFileTarget))
Files.createFile(zipFileTarget);
createEntries(files, zos);
zos.close();
return zipFileTarget;
}
}

private static List<String> createEntries(List<Path> files, ZipOutputStream zos) throws IOException {
List<String> zippedFiles = new ArrayList<>();
Matcher matcherFileExt = Pattern.compile("^.*\\.([^.]+)$").matcher("");
for (Path f : files) {
if (Files.isRegularFile(f)) {
String fileName = f.getFileName().toString();
String fileExt = matcherFileExt.reset(fileName).matches()
? matcherFileExt.replaceAll("$1")
: "unknown";
// You should determine the dir name with a more sophisticated
// approach.
String dir;
if (fileExt.equals("jpg")) dir = "images";
else if (fileExt.equals("woff")) dir = "fonts";
else dir = fileExt;

zos.putNextEntry(new ZipEntry(dir + "/" + fileName));
Files.copy(f, zos);
zippedFiles.add(fileName);
}
}
return zippedFiles;
}

编辑:此方法适用于 java 1.7+。您可以通过调用 toPath() 方法轻松地将 File 对象转换为 Path 对象。

关于Java - 使用来自不同位置的多个文件和子文件夹创建 Zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com