ファイルt.txt、ディレクトリt、および別のファイルt/t2.txtがあるとします。 Linux Zipユーティリティ「Zip -r t.Zip t.txt t」を使用すると、次のエントリを含むZipファイルが取得されます(unzip -l t.Zip)。
Archive: t.Zip
Length Date Time Name
-------- ---- ---- ----
9 04-11-09 09:11 t.txt
0 04-11-09 09:12 t/
15 04-11-09 09:12 t/t2.txt
-------- -------
24 3 files
Java.util.Zip.ZipOutputStreamでその動作を複製し、ディレクトリのZipエントリを作成しようとすると、Javaは例外をスローします。ファイルのみを処理できます。at/ t2を作成できます。 Zipファイルの.txtエントリと追加でt2.txtファイルの内容を使用しますが、ディレクトリを作成できません。なぜですか?
ZipOutputStream
canスラッシュ/
フォルダー名の後。試す( from )
public class Test {
public static void main(String[] args) {
try {
FileOutputStream f = new FileOutputStream("test.Zip");
ZipOutputStream Zip = new ZipOutputStream(new BufferedOutputStream(f));
Zip.putNextEntry(new ZipEntry("xml/"));
Zip.putNextEntry(new ZipEntry("xml/xml"));
Zip.close();
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
Java.util.Zip.ZipEntryのソースを調べてください。名前が「/」文字で終わる場合、ZipEntryをディレクトリとして扱います。ディレクトリ名の末尾に「/」を付けるだけです。
空のディレクトリだけを圧縮する場合は、この例を確認してください http://bethecoder.com/applications/tutorials/showTutorials.action?tutorialId=Java_ZipUtilities_ZipEmptyDirectory
幸運を。
他の人がここで空のディレクトリを追加すると言ったように、ディレクトリ名に「/」を追加します。空のファイルを実際にZipに追加するFile.separator(「\」に等しい)を追加しないように注意してください。
私の間違いを理解するのに時間がかかりました-他の時間を節約してください...
JavaプログラムからZip(フォルダーには空または完全なものが含まれます)
public class ZipUsingJavaUtil {
/*
* Zip function Zip all files and folders
*/
@Override
@SuppressWarnings("finally")
public boolean zipFiles(String srcFolder, String destZipFile) {
boolean result = false;
try {
System.out.println("Program Start zipping the given files");
/*
* send to the Zip procedure
*/
zipFolder(srcFolder, destZipFile);
result = true;
System.out.println("Given files are successfully zipped");
} catch (Exception e) {
System.out.println("Some Errors happned during the Zip process");
} finally {
return result;
}
}
/*
* Zip the folders
*/
private void zipFolder(String srcFolder, String destZipFile) throws Exception {
ZipOutputStream Zip = null;
FileOutputStream fileWriter = null;
/*
* create the output stream to Zip file result
*/
fileWriter = new FileOutputStream(destZipFile);
Zip = new ZipOutputStream(fileWriter);
/*
* add the folder to the Zip
*/
addFolderToZip("", srcFolder, Zip);
/*
* close the Zip objects
*/
Zip.flush();
Zip.close();
}
/*
* recursively add files to the Zip files
*/
private void addFileToZip(String path, String srcFile, ZipOutputStream Zip, boolean flag) throws Exception {
/*
* create the file object for inputs
*/
File folder = new File(srcFile);
/*
* if the folder is empty add empty folder to the Zip file
*/
if (flag == true) {
Zip.putNextEntry(new ZipEntry(path + "/" + folder.getName() + "/"));
} else { /*
* if the current name is directory, recursively traverse it
* to get the files
*/
if (folder.isDirectory()) {
/*
* if folder is not empty
*/
addFolderToZip(path, srcFile, Zip);
} else {
/*
* write the file to the output
*/
byte[] buf = new byte[1024];
int len;
FileInputStream in = new FileInputStream(srcFile);
Zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));
while ((len = in.read(buf)) > 0) {
/*
* Write the Result
*/
Zip.write(buf, 0, len);
}
}
}
}
/*
* add folder to the Zip file
*/
private void addFolderToZip(String path, String srcFolder, ZipOutputStream Zip) throws Exception {
File folder = new File(srcFolder);
/*
* check the empty folder
*/
if (folder.list().length == 0) {
System.out.println(folder.getName());
addFileToZip(path, srcFolder, Zip, true);
} else {
/*
* list the files in the folder
*/
for (String fileName : folder.list()) {
if (path.equals("")) {
addFileToZip(folder.getName(), srcFolder + "/" + fileName, Zip, false);
} else {
addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, Zip, false);
}
}
}
}
}
フォルダ名の末尾に「/」を追加できます。次のコマンドを使用するだけです。
Zip.putNextEntry(new ZipEntry("xml/"));