tôi đã tạo ra một file zip (cùng với thư mục) trong môi trường Windows như sau (Mã số được chọn từ http://www.exampledepot.com/egs/java.util.zip/CreateZip.html):Tạo Zip File Trong Windows và Giải nén Zip File Trong Linux
package sandbox;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
*
* @author yan-cheng.cheok
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// These are the files to include in the ZIP file
String[] filenames = new String[]{"MyDirectory" + File.separator + "MyFile.txt"};
// Create a buffer for reading the files
byte[] buf = new byte[1024];
try {
// Create the ZIP file
String outFilename = "outfile.zip";
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));
// Compress the files
for (int i=0; i<filenames.length; i++) {
FileInputStream in = new FileInputStream(filenames[i]);
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(filenames[i]));
// Transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// Complete the entry
out.closeEntry();
in.close();
}
// Complete the ZIP file
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Các file zip mới được tạo ra có thể được trích xuất mà không có vấn đề trong Windows, bằng cách sử dụng http://www.exampledepot.com/egs/java.util.zip/GetZip.html
Tuy nhiên, tôi nhận ra nếu tôi trích xuất tệp zip mới được tạo dưới Linux, sử dụng phiên bản sửa đổi http://www.exampledepot.com/egs/java.util.zip/GetZip.html. Phiên bản gốc không kiểm tra thư mục bằng cách sử dụng zipEntry.isDirectory()).
public static boolean extractZipFile(File zipFilePath, boolean overwrite) {
InputStream inputStream = null;
ZipInputStream zipInputStream = null;
boolean status = true;
try {
inputStream = new FileInputStream(zipFilePath);
zipInputStream = new ZipInputStream(inputStream);
final byte[] data = new byte[1024];
while (true) {
ZipEntry zipEntry = null;
FileOutputStream outputStream = null;
try {
zipEntry = zipInputStream.getNextEntry();
if (zipEntry == null) break;
final String destination = Utils.getUserDataDirectory() + zipEntry.getName();
if (overwrite == false) {
if (Utils.isFileOrDirectoryExist(destination)) continue;
}
if (zipEntry.isDirectory())
{
Utils.createCompleteDirectoryHierarchyIfDoesNotExist(destination);
}
else
{
final File file = new File(destination);
// Ensure directory is there before we write the file.
Utils.createCompleteDirectoryHierarchyIfDoesNotExist(file.getParentFile());
int size = zipInputStream.read(data);
if (size > 0) {
outputStream = new FileOutputStream(destination);
do {
outputStream.write(data, 0, size);
size = zipInputStream.read(data);
} while(size >= 0);
}
}
}
catch (IOException exp) {
log.error(null, exp);
status = false;
break;
}
finally {
if (outputStream != null) {
try {
outputStream.close();
}
catch (IOException exp) {
log.error(null, exp);
break;
}
}
if (zipInputStream != null) {
try {
zipInputStream.closeEntry();
}
catch (IOException exp) {
log.error(null, exp);
break;
}
}
}
} // while(true)
}
catch (IOException exp) {
log.error(null, exp);
status = false;
}
finally {
if (zipInputStream != null) {
try {
zipInputStream.close();
} catch (IOException ex) {
log.error(null, ex);
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException ex) {
log.error(null, ex);
}
}
}
return status;
}
"MyDirectory \ myfile.txt" thay vì myfile.txt được đặt dưới thư mục MyDirectory.
tôi cố gắng giải quyết vấn đề bằng cách thay đổi mã zip tạo tập tin để
String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"};
Nhưng, đây là một giải pháp đủ điều kiện, bởi mã hóa cứng các seperator? Nó có hoạt động dưới Mac OS không? (Tôi không có máy Mac để thử)