我试图在ZIP文件内创建一个ZIP文件,以重新构建以前在内存中的zip结构,我在Java。
我失败了,因为我得到了一个错误的内部ZIP内创建的初始ZIP文件。文件已损坏。当试图打开它时,我得到一个“文件的意外结局”。
我得到了这个结构:
-input.zip--InnerInput.zip
代码使用java Stack和Map在内存中解压。然后它创建input2.zip,内部nput.zip。
总结:我需要创建一个ZIP,里面有一个ZIP,都在内存中(暂时不保存在磁盘上)。
代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.commons.lang3.StringUtils;
public class ZipHandler1 {
private static final int BUFFER_SIZE = 2048;
private static final String ZIP_EXTENSION = ".zip";
public static final Integer FOLDER = 1;
public static final Integer ZIP = 2;
public static final Integer FILE = 3;
public static Deque<Map<Integer, Object[]>> unzip(ByteArrayOutputStream zippedOutputFile) {
try {
ZipInputStream inputStream = new ZipInputStream(
new BufferedInputStream(new ByteArrayInputStream(
zippedOutputFile.toByteArray())));
ZipEntry entry;
Deque<Map<Integer, Object[]>> result = new ArrayDeque<Map<Integer, Object[]>>();
while ((entry = inputStream.getNextEntry()) != null) {
LinkedHashMap<Integer, Object[]> map = new LinkedHashMap<Integer, Object[]>();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
System.out.println("\tExtracting entry: " + entry);
int count;
byte[] data = new byte[BUFFER_SIZE];
if (!entry.isDirectory()) {
BufferedOutputStream out = new BufferedOutputStream(
outputStream, BUFFER_SIZE);
while ((count = inputStream.read(data, 0, BUFFER_SIZE)) != -1) {
out.write(data, 0, count);
}
out.flush();
out.close();
// recursively unzip files
if (entry.getName().toUpperCase().endsWith(ZIP_EXTENSION.toUpperCase())) {
map.put(ZIP, new Object[] {entry.getName(), unzip(outputStream)});
result.add(map);
} else {
map.put(FILE, new Object[] {entry.getName(), outputStream});
result.add(map);
}
} else {
map.put(FOLDER, new Object[] {entry.getName(),
unzip(outputStream)});
result.add(map);
}
}
inputStream.close();
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package course.hernan;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.IOUtils;
public class FileReader {
private static final int BUFFER_SIZE = 2048;
public static void main(String[] args) {
try {
File f = new File("DIR/inputs.zip");
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(baos);
byte[] buffer = new byte[BUFFER_SIZE];
while (bis.read(buffer, 0, BUFFER_SIZE) != -1) {
bos.write(buffer);
}
bos.flush();
bos.close();
bis.close();
Deque<Map<Integer, Object[]>> outputDataStack = ZipHandler1.unzip(baos);
//Output file
File fout = new File("DIR/inputs2.zip");
ZipOutputStream zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(fout)));
processZip(outputDataStack, zipOutput);
zipOutput.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static final void processZip(Deque<Map<Integer, Object[]>> outputDataStack,
ZipOutputStream zipOutput) throws IOException {
while (!outputDataStack.isEmpty()) {
Map<Integer, Object[]> map = outputDataStack.pop();
for (Map.Entry<Integer, Object[]> entry : map.entrySet()) {
System.out.println("KEY:" + entry.getKey());
Object[] values = entry.getValue();
String entryName = (String)values[0];
if (entry.getKey().equals(ZipHandler1.FILE)) {
System.out.println("..........................");
System.out.println("type: FILE");
System.out.println("Name: " + entryName);
zipOutput.putNextEntry(new ZipEntry(entryName));
byte[] outputByteArray = ((ByteArrayOutputStream)values[1]).toByteArray();
IOUtils.write(outputByteArray, zipOutput);
zipOutput.closeEntry();
((ByteArrayOutputStream)values[1]).close();
} else if (entry.getKey().equals(ZipHandler1.FOLDER)) {
System.out.println("..........................");
System.out.println("type: FOLDER");
System.out.println("Name: " + entryName);
zipOutput.putNextEntry(new ZipEntry(entryName));
System.out.println("..........................");
zipOutput.closeEntry();
} else if (entry.getKey().equals(ZipHandler1.ZIP)) {
System.out.println("..........................");
System.out.println("type: ZIP");
System.out.println("Name: " + entryName);
zipOutput.putNextEntry(new ZipEntry(entryName));
ByteArrayOutputStream innerZipByteArray = new ByteArrayOutputStream(BUFFER_SIZE);
ZipOutputStream innerZipOutput = new ZipOutputStream(
new BufferedOutputStream(innerZipByteArray));
processZip((Deque<Map<Integer,Object[]>>)values[1], innerZipOutput);
innerZipOutput.flush();
IOUtils.write(zzzz.toByteArray(), zipOutput);
innerZipOutput.close();
zipOutput.closeEntry();
System.out.println("..........................");
}
System.out.println("..........................");
zipOutput.closeEntry();
}
}
}
多亏了我!
答案对我来说很难找到,也许对其他人来说是显而易见的。
简短回答:我关闭内部压缩流太快了
好的,问题是在一个ZIP中存储一个ZIP,对吗?嗯,我得到了一个错误,因为内部拉链关闭得太快了
解决方案:
创建这样的内部zip文件:ByteArrayOutputStream innerZipBufferOutput=new ByteArrayOutputStream(BUFFER_SIZE); ZipOutputStream innerZipOutput=new ZipOutputStream(new BufferedOutputStream(innerZipBufferOutput));
将字节(信息)写入内部zip
关闭内部拉链流innerZipOutput.close (); **这是我在错误的时间关闭*
此时,字节形式的数据在innerZipBufferOutput中
在外部zip文件中为内部zip文件设置条目
ZipEntry newEntry = new ZipEntry(entryName);
zipOutput.putNextEntry(newEntry);
将内拉链写入外拉链
zipOutput.write(innerZipBufferOutputByteArray);
关闭外拉链
zipOutput.flush();
zipOutput.closeEntry();
瞧!
示例(代码摘录)——您有一个ZipoutStream(外部zip文件)
ByteArrayOutputStream innerZipBufferOutput = new ByteArrayOutputStream(BUFFER_SIZE);
ZipOutputStream innerZipOutput = new ZipOutputStream(new BufferedOutputStream(innerZipBufferOutput));
<<process - e.g. create your inner zip file>>
innerZipOutput.flush();
innerZipOutput.close();
ZipEntry newEntry = new ZipEntry(<<your entry name>>);
zipOutput.setMethod(ZipOutputStream.STORED);
byte[] innerZipBufferOutputByteArray = innerZipBufferOutput.toByteArray();
//Create the nested ZIP inside the outer ZIP
ZipEntry newEntry = new ZipEntry(entryName);
zipOutput.putNextEntry(newEntry);
zipOutput.write(innerZipBufferOutputByteArray);
zipOutput.closeEntry();
zipOutput.close();
问题内容: 与此jar命令等效的Java是什么: 我想以编程方式创建此jar文件,因为我不确定命令是否位于我可以运行外部进程的系统路径上。 编辑 :我只想存档(和压缩)目录。不必遵循任何Java标准。即:标准拉链就可以了。 问题答案: // These are the files to include in the ZIP file String[] source = new String[]{“
我有一个followgradle任务,它负责包装。它在其中生成一个zip文件。但是,作为最终发行版的一部分,我正在尝试在zip文件中创建一个空文件夹调用日志。 上面的代码不起作用,我已经试过了 然后复制 问题是,如果我运行gradleclean包,它会清除导致日志文件夹未创建的构建文件夹。有没有人能解决在我们试图创建的zip发行版中创建空文件夹的问题?
本文向大家介绍Java中创建ZIP文件的方法,包括了Java中创建ZIP文件的方法的使用技巧和注意事项,需要的朋友参考一下 java创建zip文件的代码如下如下: 补充:下面看下JAVA中创建ZIP文件,并向ZIP文件中写入并读取条目和数据 总结 以上所述是小编给大家介绍的Java中创建ZIP文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐
问题内容: 我正在尝试将 文件 从 一个文件夹 保存到 另一个 文件夹 。 zip文件夹 放置在其他目录中。而且我编写了以下代码: archive.php 但是可惜我无法创建.zip文件夹。我错过了任何一步吗? 问题答案: TEST是您的项目文件夹名称。 您可以根据需要定义路径。
我尝试了多种方法来创建这个zip文件在Java /Groovy.我尝试的前几个方法,来自各种博客/帖子,导致无法打开损坏的zip文件。所以,我尝试了这个(下图),看起来相当有希望。系统报告传递到FileInputStream的有效文件路径。我不确定是否是FQ路径被传递到ZipOutputStream导致了这个问题。不管怎样,下面是代码,它导致创建小(188kb)zip文件(没有条目)。有什么建议吗
问题内容: 我有一个动态文本文件,可以根据用户的查询从数据库中选择内容。我必须将此内容写入文本文件,并将其压缩在servlet的文件夹中。我应该怎么做? 问题答案: 看这个例子: 这将在D:named 的根目录中创建一个文件,其中将包含一个名为的单个文件。当然,你可以添加更多的zip条目,还可以指定一个子目录,如下所示: