Tôi có một số mã hiện có để tạo tệp zip ở định dạng Epub 2, hoạt động chính xác.Java NIO Zip Filesystem tương đương với setMethod() trong java.util.zip.ZipEntry
Khi cố gắng cập nhật mã của mình để hỗ trợ định dạng Epub 3, tôi nghĩ mình sẽ thử Hệ thống tập tin Zip NIO Java thay vì java.util.zip.ZipFile
. Tôi gần như có ngoại trừ một món đồ nhỏ.
Có một tệp 2023 mimetype
bắt buộc theo định dạng Epub mà phải được đặt vào mã zip ở dạng không nén. java.util.zip.ZipEntry
api cung cấp setMethod(ZipEntry.STORED)
để đạt được điều này.
Tôi không thể tìm thấy bất kỳ tham chiếu nào về điều này trong tài liệu API Java NIO FileSystem. Có tương đương với ZipEntry.setMethod()
không?
EDIT 1
OK, vì vậy tôi xem làm thế nào để hiển thị các thuộc tính, và cảm ơn bạn ví dụ đó, nhưng tôi không thể tìm thấy bất kỳ doc về cách tạo một thuộc tính như (zip : phương thức, 0), ngay cả trên oracle của Oracle. Các cải tiến NIO trong Java 7 dường như với tôi chỉ có khoảng 20% tài liệu. Thuộc tính api doc rất thưa thớt, đặc biệt là cách tạo thuộc tính.
Cảm giác tôi bắt đầu nhận được là hệ thống tệp Zip NIO có thể không cải thiện trên java.util.zip
và yêu cầu nhiều mã hơn để đạt được kết quả tương tự.
EDIT 2
tôi thử như sau:
String contents = "application/epub+zip"; /* contents of mimetype file */
Map<String, String> map = new HashMap<>();
map.put("create", "true");
Path zipPath = Paths.get("zipfstest.zip");
Files.deleteIfExists(zipPath);
URI fileUri = zipPath.toUri(); // here
URI zipUri = new URI("jar:" + fileUri.getScheme(), fileUri.getPath(), null);
try (FileSystem zipfs = FileSystems.newFileSystem(zipUri, map)) {
Path pathInZip = zipfs.getPath("mimetype");
Files.createFile(pathInZip, new ZipFileAttribute<Integer>("zip:method", 0));
byte[] bytes = contents.getBytes();
Files.write(pathInZip, bytes, StandardOpenOption.WRITE);
}
Lớp ZipFileAttribute là một việc thực hiện tối thiểu của các thuộc tính giao diện. Tôi có thể đăng nó nhưng nó chỉ là một cặp khóa-giá trị (tên, giá trị)
Mã này tạo tệp zipFile thành công, nhưng khi tôi mở tệp zipFile với 7zip, tôi thấy tệp mimetype được lưu trữ trong mã zip là DEFLATED (8) thay vì những gì tôi cần được lưu trữ (0). Vì vậy, câu hỏi là, làm thế nào để tôi mã các thuộc tính một cách chính xác để nó lưu trữ như STORED.
Bạn nói đúng, tôi đã có một cái nhìn tại các triển khai OpenJDK của ** ZipFileSystem.java ** và buồn bã khi viết nộp zip phương pháp này là hardcoded để "xì hơi" và không thể được ghi đè bằng "LƯU": 'u.method = METHOD_DEFLATED;' – Codetoffel