2015-01-30 5 views
7

में setMethod() के समतुल्य है। मेरे पास एपब 2 प्रारूप में ज़िप फ़ाइलों को बनाने के लिए कुछ मौजूदा कोड है, जो सही तरीके से काम करता है।जावा एनआईओ ज़िप फ़ाइल सिस्टम java.util.zip.ZipEntry

एपब 3 प्रारूप का समर्थन करने के लिए मेरे कोड को अपडेट करने का प्रयास करते हुए, मैंने सोचा कि मैं java.util.zip.ZipFile के बजाय जावा एनआईओ ज़िप फ़ाइल सिस्टम का प्रयास करूंगा। मैं लगभग एक छोटी वस्तु को छोड़कर वहां हूं।

एपब प्रारूप द्वारा आवश्यक 20 बाइट mimetype फ़ाइल है जो को असंपीड़ित रूप में ज़िप में डाल दिया जाना चाहिए। java.util.zip.ZipEntry एपीआई इसे प्राप्त करने के लिए setMethod(ZipEntry.STORED) प्रदान करता है।

मुझे जावा एनआईओ फाइलसिस्टम एपीआई दस्तावेज़ में इसका कोई संदर्भ नहीं मिल रहा है। क्या ZipEntry.setMethod() के बराबर है?

संपादित करें 1

ठीक है, तो मैं कैसे गुण प्रदर्शित करने के लिए, और कहा कि उदाहरण के लिए धन्यवाद, लेकिन मैं कैसे जैसे बनाने के लिए एक विशेषता पर किसी भी दस्तावेज़ को नहीं मिल सकता है देखने के (ज़िप : विधि, 0), ओरेकल के अपने ओरेकल पर भी। जावा 7 में एनआईओ एन्हांसमेंट्स मुझे लगता है कि केवल 20% दस्तावेज हैं। विशेषताओं एपीआई दस्तावेज़ बहुत स्पैस है, खासकर गुण कैसे बनाएं।

मुझे लगता है कि मुझे लगता है कि एनआईओ ज़िप फाइल सिस्टम java.util.zip पर कोई सुधार नहीं हो सकता है, और उसी परिणाम को प्राप्त करने के लिए और कोड की आवश्यकता है।

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); 
    } 

ZipFileAttribute वर्ग विशेषता इंटरफ़ेस का एक न्यूनतम दिया गया है:

संपादित 2

मैं निम्नलिखित की कोशिश की। मैं इसे पोस्ट कर सकता हूं लेकिन यह सिर्फ एक कुंजी-मूल्य जोड़ी (नाम, मान)

इस कोड ने ज़िपफाइल सफलतापूर्वक बनाया है, लेकिन जब मैं ज़िप फ़ाइल को 7zip के साथ खोलता हूं, तो मुझे लगता है कि mimetype फ़ाइल को ज़िप में संग्रहीत किया गया था (8) जो मुझे चाहिए उसकी बजाय जो स्थिर है (0)। तो सवाल यह है कि, मैं विशेषता को सही तरीके से कैसे कोड करूं ताकि यह स्टोर के रूप में संग्रहीत हो।

उत्तर

2

यह बहुत अच्छी तरह से प्रलेखित नहीं है लेकिन जेडीके का ज़िप फाइल सिस्टम प्रदाता नाम से FileAttributeView का समर्थन करता है।

यहाँ मेरा एक ज़िप से कोड है:

public static void main(final String... args) 
    throws IOException 
{ 
    final Path zip = Paths.get("/home/fge/t.zip"); 
    final Map<String, ?> env = Collections.singletonMap("readonly", "true"); 
    final URI uri = URI.create("jar:" + zip.toUri()); 

    try (
     final FileSystem fs = FileSystems.newFileSystem(uri, env); 
    ) { 
     final Path slash = fs.getPath("/"); 
     Files.readAttributes(slash, "zip:*").forEach((key, val) -> { 
      System.out.println("Attribute name: " + key); 
      System.out.printf("Value: %s (class: %s)\n", val, 
       val != null ? val.getClass(): "N/A"); 
     }); 
    } 
} 

आउटपुट:

Attribute name: size 
Value: 0 (class: class java.lang.Long) 
Attribute name: creationTime 
Value: null (class: N/A) 
Attribute name: lastAccessTime 
Value: null (class: N/A) 
Attribute name: lastModifiedTime 
Value: 1969-12-31T23:59:59.999Z (class: class java.nio.file.attribute.FileTime) 
Attribute name: isDirectory 
Value: true (class: class java.lang.Boolean) 
Attribute name: isRegularFile 
Value: false (class: class java.lang.Boolean) 
Attribute name: isSymbolicLink 
Value: false (class: class java.lang.Boolean) 
Attribute name: isOther 
Value: false (class: class java.lang.Boolean) 
Attribute name: fileKey 
Value: null (class: N/A) 
Attribute name: compressedSize 
Value: 0 (class: class java.lang.Long) 
Attribute name: crc 
Value: 0 (class: class java.lang.Long) 
Attribute name: method 
Value: 0 (class: class java.lang.Integer) 

यह लग रहा है की तरह "जिप: विधि" विशेषता तुम क्या चाहते है।

तो, आप विधि को बदलना चाहते हैं, यदि आप अपने ज़िप फाइल सिस्टम में एक Path है, ऐसा लगता है कि आप कर सकते हैं लग रहा है (untested!):

Files.setAttribute(thePath, "zip:method", ZipEntry.DEFLATED); 
1

नीचे बहुत ही दिलचस्प जबाब के आधार पर, मैंने सभी एपीआई दस्तावेज़ उपलब्ध कराए और एक विशेषता सेट करने पर विभिन्न अनुमानों का प्रयास किया। मैंने दोनों पर एक खाली खींचा।मुझे निष्कर्ष निकालने के लिए मजबूर किया गया है कि यह कार्यक्षमता सबसे अच्छी तरह से अनियंत्रित है, और यहां तक ​​कि जावा एनआईओ में भी अनुपलब्ध है। तो कोई भी जो ईपीबीबी प्रारूप में फाइलें बनाना चाहता है, जैसा कि मैंने किया है, को पुराने ZipFile आधारित एपीआई का उपयोग करना जारी रखना होगा। विकल्प ZipFile या किसी अन्य भाषा के साथ बनाए गए खोल ज़िप का उपयोग करना है, और उसके बाद एनआईओ पर स्विच करें। इन दोनों विकल्पों में से हैं - मैं कैसे कहूंगा - कुछ हद तक सुरुचिपूर्ण। मैंने सोचा कि यह समय के साथ अर्ध-बहिष्कृत होने के लिए java.io.File के लिए था।

+0

आप ठीक कह रहे हैं, मैं ** ZipFileSystem.java ** और के OpenJDK कार्यान्वयन पर एक नज़र था उदासी जब लेखन एक ज़िप फ़ाइल विधि "हवा निकाल" करने के लिए hardcoded जाता है और "संग्रहीत" के साथ ओवरराइट नहीं किया जा सकता: 'u.method = METHOD_DEFLATED;' – Codetoffel

संबंधित मुद्दे