如何在不写入磁盘的情况下解析 zip 中的文件 - java
How to parse file inside a zip without writing to disk - java
我有一个受密码保护的 zip 文件 [采用 base64 编码数据和 zip 文件名称的形式],其中包含一个 xml。我希望在不向磁盘写入任何内容的情况下解析 xml。在 Zip4j 中有什么方法可以做到这一点?以下是我尝试过的。
String docTitle = request.getDocTitle();
byte[] decodedFileData = Base64.getDecoder().decode(request.getBase64Data());
InputStream inputStream = new ByteArrayInputStream(decodedFileData);
try (ZipInputStream zipInputStream = new ZipInputStream(inputStream, password)) {
while ((localFileHeader = zipInputStream.getNextEntry()) != null) {
String fileTitle = localFileHeader.getFileName();
File extractedFile = new File(fileTitle);
try (InputStream individualFileInputStream = org.apache.commons.io.FileUtils.openInputStream(extractedFile)) {
// Call parser
parser.parse(localFileHeader.getFileName(),
individualFileInputStream));
} catch (IOException e) {
// Handle IOException
}
}
} catch (IOException e) {
// Handle IOException
}
这让我 java.io.FileNotFoundException: File 'xyz.xml' does not exist
在第 FileUtils.openInputStream(extractedFile)
行。你能告诉我正确的方法吗?
ZipInputStream
保留 zip 文件的所有内容。 zipInputStream.getNextEntry()
的每次调用都会传递每个文件的内容并将“指针”移动到下一个条目(文件)。您还可以在移动到下一个条目之前阅读文件 (ZipInputStream.read)。
您的情况:
byte[] decodedFileData = Base64.getDecoder().decode(request.getBase64Data());
InputStream inputStream = new ByteArrayInputStream(decodedFileData);
try (ZipInputStream zipInputStream = new ZipInputStream(inputStream, password)) {
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
byte[] fileContent = IOUtils.toByteArray(zipInputStream);
parser.parse(zipEntry.getName(),
new ByteArrayInputStream(fileContent)));
}
} catch (Exception e) {
// Handle Exception
}
我有一个受密码保护的 zip 文件 [采用 base64 编码数据和 zip 文件名称的形式],其中包含一个 xml。我希望在不向磁盘写入任何内容的情况下解析 xml。在 Zip4j 中有什么方法可以做到这一点?以下是我尝试过的。
String docTitle = request.getDocTitle();
byte[] decodedFileData = Base64.getDecoder().decode(request.getBase64Data());
InputStream inputStream = new ByteArrayInputStream(decodedFileData);
try (ZipInputStream zipInputStream = new ZipInputStream(inputStream, password)) {
while ((localFileHeader = zipInputStream.getNextEntry()) != null) {
String fileTitle = localFileHeader.getFileName();
File extractedFile = new File(fileTitle);
try (InputStream individualFileInputStream = org.apache.commons.io.FileUtils.openInputStream(extractedFile)) {
// Call parser
parser.parse(localFileHeader.getFileName(),
individualFileInputStream));
} catch (IOException e) {
// Handle IOException
}
}
} catch (IOException e) {
// Handle IOException
}
这让我 java.io.FileNotFoundException: File 'xyz.xml' does not exist
在第 FileUtils.openInputStream(extractedFile)
行。你能告诉我正确的方法吗?
ZipInputStream
保留 zip 文件的所有内容。 zipInputStream.getNextEntry()
的每次调用都会传递每个文件的内容并将“指针”移动到下一个条目(文件)。您还可以在移动到下一个条目之前阅读文件 (ZipInputStream.read)。
您的情况:
byte[] decodedFileData = Base64.getDecoder().decode(request.getBase64Data());
InputStream inputStream = new ByteArrayInputStream(decodedFileData);
try (ZipInputStream zipInputStream = new ZipInputStream(inputStream, password)) {
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
byte[] fileContent = IOUtils.toByteArray(zipInputStream);
parser.parse(zipEntry.getName(),
new ByteArrayInputStream(fileContent)));
}
} catch (Exception e) {
// Handle Exception
}