Dobrý den,
Dostal jsem takový domácí úkol, který viipadá následovně:
Vytvořte aplikaci, která vypíše do konzole strukturu nějakého zip souboru, a to takto:
A.zip
soubor0.txt
B.zip
C.zip
soubor1.txt
V C# se dá rekurzivně soubor A.zip procházet takto:
ZipArchive([b]Stream[/b])
Inicializuje novou instanci ZipArchive trídy ze zadaného datového proudu.
ZipArchiveEntry ZipArchive.Entries
Získá kolekci položek, které jsou aktuálne v archivu zip.
[b]Stream [/b]ZipArchiveEntry.open()
Otevre položku z archivu zip.
Já se však rozhodl, že raději pužiju Javu, protože je lepší. V Javě ovšem je pouze tato varianta:
ZipFile(File file)
Enumeration<? extends ZipEntry> ZipFile.entries()
InputStream ZipFile.getInputStream(ZipEntry entry)
To samozřejmě nikterak neumožní, získat v A.zip pomocí třídy ZipFile soubor B.zip a ten si opět otevřít a procházet třídou ZipFile, neboť ZipFile umí vzít pouze File, tedy soubor, který musí existovat na disku. Jak jsem dále pátral, v Javě není možné vytvořit virtuální File a provézt tedy celou operaci přes paměť. Není zde tedy jiné možnosti, než B.zip a C.zip rozbalit, uložit separátně na disk, a poté opět otevřít v ZipFile.
Celá záležitost je v případě Javy o to, kulantně řečeno, podivnější, protože jak je známo, výstupní artefakty .jar a .war jsou v podstatě ZIP soubory. Bystrý člověk by tedy očekával, že práce se ZIP soubory by měla být v Javě více než bezproblémová.
Konzultoval jsem to proto s panem Filipem Jirsákem, který je zkušený Javista a Javě se věnoval převážnou část svého života. Podle něj se má věc takto:
Zvolil jste si špatný formát souboru. ZIP není urcený k ukládání na pásku (na rozdíl treba od gzip nebo bzip2), k jeho dekompresi potrebujete náhodný prístup k souboru. Proto to nefunguje se streamem, ale je potreba predat soubor. S Javou to nijak nesouvisí, takhle byste to musel udelat s každou knihovnou v libovolném jazyce.
Z názoru odborníka, pana Jirsáka, jsem však poněkud zmaten. Jednak Java sama produkuje ZIP soubory při sestavování aplikace, do kterých hierarchicky umístí další ZIP soubory v závislostech, které pak obsahují další a další ZIP soubory. Moc tedy nerozumím, proč jsem si vybral špatný formát. Druhý důvod je ten, že podstata Streamu, ve smyslu, jak je používán v .NET nebo v Javě, nemá nutně co dělat s formátem, ve kterém je zdroj uložen - obojí je zkrátka abstraktně představuje tok dat, který může procházet jistou transformací. Domnívám se proto, že sučíp pan Jirsák nemá tak úplně pravdu.
Chtěl bych se proto zeptat vás zkušenější (než já), zdaž-li jde o chibu návrhu standardný knihovny v Java ecčars a pokud ano, zda biste mi to mohli vysvětlit. Myslel jsem si, že Java je velice úspěšná a má za sebou 20 let vývoje a podle některých webů jde dokonce o nejpouživánější jazyk na světě. Používají ho dokonce lidi jako je pan Jirskák, a ti by určitě nedělal v ničem, co by bylo hned ve standardní knihvě Jazyka implementováno poněkud nelogicky.
Děkuji za odpověď.
Péťa.