可能重复:
追加文件与Java一个zip文件
你好Java开发者,
这里的情景:
说我有一个文本文件命名sample.txt
。 我真正想要做的是把sample.txt
文件转换成*.zip
文件名为TextFiles.zip
。
以下是我已经学会为止。
try{
File f = new File(compProperty.getZIP_OUTPUT_PATH());
zipOut = new ZipOutputStream(new FileOutputStream(f));
ZipEntry zipEntry = new ZipEntry("sample.txt");
zipOut.putNextEntry(zipEntry);
zipOut.closeEntry();
zipOut.close();
System.out.println("Done");
} catch ( Exception e ){
// My catch block
}
到目前为止我的代码创建一个*.zip
文件并插入sample.txt
文件。
我的问题是如何将我能够插入现有文件的创建*.zip
文件?
如果你的答案有什么关系TrueZIP ,请张贴SSCCE。
我也做了以下情况:
- 谷歌搜索
- 搜索现有的问题。 (找到几个。没有回答。一些没有回答我的问题特别。
- 阅读TrueZip 。 然而,我无法理解的事情。 (请不要理解)
使用内置的Java API。 这将文件添加到一个ZIP文件,这将取代任何可能存在的现有Zip文件,创建一个新的Zip文件。
public class TestZip02 {
public static void main(String[] args) {
try {
zip(new File("TextFiles.zip"), new File("sample.txt"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void zip(File zip, File file) throws IOException {
ZipOutputStream zos = null;
try {
String name = file.getName();
zos = new ZipOutputStream(new FileOutputStream(zip));
ZipEntry entry = new ZipEntry(name);
zos.putNextEntry(entry);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
byte[] byteBuffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = fis.read(byteBuffer)) != -1) {
zos.write(byteBuffer, 0, bytesRead);
}
zos.flush();
} finally {
try {
fis.close();
} catch (Exception e) {
}
}
zos.closeEntry();
zos.flush();
} finally {
try {
zos.close();
} catch (Exception e) {
}
}
}
}
在这里你可以得到的回答你的问题: http://truezip.schlichtherle.de/2011/07/26/appending-to-zip-files/
看来,根据史诗JDK参考 ,你可以使用while zis.getNextEntry() != null
通过文件(其中ZIS是ZipInputStream)循环来,然后用zis.read()
读入一个数组,其被发送到一个ArrayList或相似。
然后,人们可以使用toArray()
“浇铸”到一个byte
数组用这种方法和zos.write()
到输出ZIP文件(其中ZOS是ZipOutputStream
),采用zos.putNextEntry()
使新的条目。 (您将需要保存的ZipEntry,并得到它的名字ze.getName()
与ze
是一个ZipEntry
。)此时应更换T
用Byte
和byte
(使用byte
无处不在,但for
循环体),并可能需要修改铸造代码使用Byte.byteValue()
以从转化Byte
(包装类)以byte
(原语类型),如下所示:
for(int i = 0; i < objects.length; i++) {
convertedObjects[i] = (Byte)objects[i].byteValue();
}
请注意,这是未经测试和基于JDK(条目ZipInputStream
, ZipOutputStream
, ArrayList
,和Byte
)和阵列铸造谷歌搜索。
很抱歉,如果这是一个有点迟钝,并希望这有助于!