gpt4 book ai didi

java - 在 Java 中修改 ZIP 存档中的文本文件

转载 作者:太空狗 更新时间:2023-10-29 22:33:20 27 4
gpt4 key购买 nike

我的用例要求我打开一个 txt 文件,比如 abc.txt,它位于一个 zip 存档中,其中包含以下形式的键值对

key1=value1

key2=value2

.. 等等,每个键值对都在一个新行中。我必须更改与某个键对应的一个值,并将文本文件放回存档的新副本中。我如何在 Java 中执行此操作?

到目前为止我的尝试:

    ZipFile zipFile = new ZipFile("test.zip");
final ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("out.zip"));
for(Enumeration e = zipFile.entries(); e.hasMoreElements(); ) {
ZipEntry entryIn = (ZipEntry) e.nextElement();
if(!entryIn.getName().equalsIgnoreCase("abc.txt")){
zos.putNextEntry(entryIn);
InputStream is = zipFile.getInputStream(entryIn);
byte [] buf = new byte[1024];
int len;
while((len = (is.read(buf))) > 0) {
zos.write(buf, 0, len);
}
}
else{
// I'm not sure what to do here
// Tried a few things and the file gets corrupt
}
zos.closeEntry();
}
zos.close();

最佳答案

Java 7 引入了一种更简单的 zip 存档操作方法 - FileSystems API,它允许作为文件系统访问文件的内容。

除了更直接的 API 之外,它正在就地进行修改,不需要重写 zip 存档中的其他(不相关)文件(如接受的答案中所做的那样)。

这是解决 OP 用例的示例代码:

import java.io.*;
import java.nio.file.*;

public static void main(String[] args) throws IOException {
modifyTextFileInZip("test.zip");
}

static void modifyTextFileInZip(String zipPath) throws IOException {
Path zipFilePath = Paths.get(zipPath);
try (FileSystem fs = FileSystems.newFileSystem(zipFilePath, null)) {
Path source = fs.getPath("/abc.txt");
Path temp = fs.getPath("/___abc___.txt");
if (Files.exists(temp)) {
throw new IOException("temp file exists, generate another name");
}
Files.move(source, temp);
streamCopy(temp, source);
Files.delete(temp);
}
}

static void streamCopy(Path src, Path dst) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(Files.newInputStream(src)));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(Files.newOutputStream(dst)))) {

String line;
while ((line = br.readLine()) != null) {
line = line.replace("key1=value1", "key1=value2");
bw.write(line);
bw.newLine();
}
}
}

有关更多 zip 存档操作示例,请参阅您可以下载的 demo/nio/zipfs/Demo.java 示例 here (查找 JDK 8 演示和样本)。

关于java - 在 Java 中修改 ZIP 存档中的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502260/

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