Java a C# - porovnání práce se Zip souborem

Peťa

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #15 kdy: 28. 04. 2017, 16:49:26 »
Už u toho předchozího trolení stačilo napsat mu těch 10 řádků a neřešit nesmysly. Tady diskuze o ničem a řešení se čtyřma třídama.  :-\ :-\

Napsal bi si mi tech 10 radku, co rekurzivně projdou nějaký zip soubor a vipíšou jeho obsah do konzole, přičemž budeš používat pouze sdk?


.

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #16 kdy: 28. 04. 2017, 17:09:41 »
Tak trošku víc než 10.
Kód: [Vybrat]
public static void dump(String pad, ZipInputStream zis) throws Exception {
ZipEntry ze;
byte[] data = new byte[128];
while ((ze = zis.getNextEntry()) != null) {
String name = ze.getName();
System.out.println(pad + "name: " + name);
if (name.endsWith(".zip")) {
dump(pad + "  ", new ZipInputStream(zis));
} else {
System.out.print(pad + "data: ");
System.out.write(data, 0, zis.read(data, 0, data.length));
}
}
}

public static void main(String[] args) throws Exception {
dump("> ", new ZipInputStream(new FileInputStream("a.zip")));
}
Kód: [Vybrat]
> name: a.txt
> data: [data a.txt]
> name: b.zip
>   name: b.txt
>   data: [data b.txt]
>   name: c.zip
>     name: c.txt
>     data: [data c.txt]

Youda

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #17 kdy: 28. 04. 2017, 17:14:45 »
Už u toho předchozího trolení stačilo napsat mu těch 10 řádků a neřešit nesmysly. Tady diskuze o ničem a řešení se čtyřma třídama.  :-\ :-\

Napsal bi si mi tech 10 radku, co rekurzivně projdou nějaký zip soubor a vipíšou jeho obsah do konzole, přičemž budeš používat pouze sdk?

Mrkni se do .Net SDK, jestli tam neni pribaleny nejaky checker ceske gramatiky.
Ja teda nejsem grammar nazi, ale z tveho psaneho projevu mi krvaceji oci.

Youda

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #18 kdy: 28. 04. 2017, 17:21:22 »
A naco by meli v tom C# teda taky ten Maven, kdyz zadne externi knohovny importovat nemusi, prOtoze uz vsechno ma C# v zakladni verzi? Je to jeste k necemu dobre ten Maven? Nebo to ma Java prave proto, abi se treba daly naimportovat veci, ketere v zakladni Jave budto vubec nejsou nebo tam nejsou udelane moc dobre?

No napriklad, pokud chci z .Net poslat SNMP trap, base SDK to neumi.
Umi to knihovna http://sharpsnmplib.codeplex.com/
Jenze neni v mavenu, takze si to hezky manualne stahni, pridej do projektu a jednou za cas se mrkni na stranky, jestli neexistuje nejaka nova verze.

phi

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #19 kdy: 28. 04. 2017, 17:31:04 »
Ten moment, kdy si chces nad krb povesit hlavu trolla :D


Juro

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #20 kdy: 28. 04. 2017, 18:49:26 »
.NET a Java ma inu filozofiu a ekosystem. .NET Framework je v mnohom cistejsi a elegantnejsi, je vacsia sanca, ze priamo v zakladnom frameworku najdes peknu triedu na to, co potrebujes. V Jave ju vacsinou najdes v nejakom apachovskom alebo podobnom projekte ako malu a samostatnu kniznicu, pripadne na to najdes kniznice rovno 4 a rozhodni sa. Toto .NET-aci, ktori prechadzaju na Javu moc radi nemaju a ked sa pozru na JDK, biju si hlavu o stenu, kolko malych a zakladnych veci musia tahat niekde z vonka, na zaklade coho sa maju rozhodnut pre nejake jar-ko, ktore implementuje "zakladne veci", preco sa vobec musia rozhodovat a dohadovat sa kolegami, ktora je lepsia a preco sa kazda prkotina da riesit na 5 sposobov.

P_V

  • ***
  • 224
    • Zobrazit profil
    • E-mail
Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #21 kdy: 28. 04. 2017, 21:12:05 »
O co, že se vám nepodaří rekurzivně projít tenhle zip.
http://swtch.com/r.zip

Péťa

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #22 kdy: 28. 04. 2017, 21:40:57 »
Tak trošku víc než 10.
Kód: [Vybrat]
public static void dump(String pad, ZipInputStream zis) throws Exception {
ZipEntry ze;
byte[] data = new byte[128];
while ((ze = zis.getNextEntry()) != null) {
String name = ze.getName();
System.out.println(pad + "name: " + name);
if (name.endsWith(".zip")) {
dump(pad + "  ", new ZipInputStream(zis));
} else {
System.out.print(pad + "data: ");
System.out.write(data, 0, zis.read(data, 0, data.length));
}
}
}

public static void main(String[] args) throws Exception {
dump("> ", new ZipInputStream(new FileInputStream("a.zip")));
}
Kód: [Vybrat]
> name: a.txt
> data: [data a.txt]
> name: b.zip
>   name: b.txt
>   data: [data b.txt]
>   name: c.zip
>     name: c.txt
>     data: [data c.txt]

Takže mýlka vznikla z toho důvodu, že ten ZipInputStream je Stream a zároveň iterátor. Je to špatný OOP návrh, který porušuje Single responsibility princip, v dokumentaci třídy není uvedeno, že se jedná o kočkopsa a proto mi nedošlo, jak se to má používat. Správné by bylo, kdyby ZipInputStream byl iterátor nad ZipEntry, a na ZipEntry by mělo getInputStream(). Ale pokud dělali Javu stejní kokodi, jako dělali SQL Developera, Eclipse a podobné, tak se není moc čemu divit.

balki

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #23 kdy: 28. 04. 2017, 22:03:12 »
Tak trošku víc než 10.
Kód: [Vybrat]
public static void dump(String pad, ZipInputStream zis) throws Exception {
ZipEntry ze;
byte[] data = new byte[128];
while ((ze = zis.getNextEntry()) != null) {
String name = ze.getName();
System.out.println(pad + "name: " + name);
if (name.endsWith(".zip")) {
dump(pad + "  ", new ZipInputStream(zis));
} else {
System.out.print(pad + "data: ");
System.out.write(data, 0, zis.read(data, 0, data.length));
}
}
}

public static void main(String[] args) throws Exception {
dump("> ", new ZipInputStream(new FileInputStream("a.zip")));
}
Kód: [Vybrat]
> name: a.txt
> data: [data a.txt]
> name: b.zip
>   name: b.txt
>   data: [data b.txt]
>   name: c.zip
>     name: c.txt
>     data: [data c.txt]

Takže mýlka vznikla z toho důvodu, že ten ZipInputStream je Stream a zároveň iterátor. Je to špatný OOP návrh, který porušuje Single responsibility princip, v dokumentaci třídy není uvedeno, že se jedná o kočkopsa a proto mi nedošlo, jak se to má používat. Správné by bylo, kdyby ZipInputStream byl iterátor nad ZipEntry, a na ZipEntry by mělo getInputStream(). Ale pokud dělali Javu stejní kokodi, jako dělali SQL Developera, Eclipse a podobné, tak se není moc čemu divit.

Nic to neporusuje, iterator je normalny navrhovy vzor a pouziva sa bezne pri streamoch. Vratte diplom prosim.

Peťa

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #24 kdy: 28. 04. 2017, 22:06:27 »
Běžně kde? V Javě? Uvedte priklad.

Správně to ma udělané C#.

balki

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #25 kdy: 28. 04. 2017, 22:18:20 »
Běžně kde? V Javě? Uvedte priklad.

Správně to ma udělané C#.

Bezne je to napriklad v smalltalku.

Kód: [Vybrat]
r := ReadStream on: (1 to: 1000).
r next.   -→ 1
r next.   -→ 2
r atEnd.-→ false

Peťa

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #26 kdy: 28. 04. 2017, 22:24:17 »
Běžně kde? V Javě? Uvedte priklad.

Správně to ma udělané C#.

Bezne je to napriklad v smalltalku.

Kód: [Vybrat]
r := ReadStream on: (1 to: 1000).
r next.   -→ 1
r next.   -→ 2
r atEnd.-→ false

Omg no ty budeš inteligent, to je ale naprosto jinaci situace, tam je samotny Stream implementovany formou iteratoru... Nejdrive se podivej, o cem je tady rec, a nebo pokud to vis, vrat diplom.

balki

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #27 kdy: 28. 04. 2017, 22:35:32 »
Běžně kde? V Javě? Uvedte priklad.

Správně to ma udělané C#.

Bezne je to napriklad v smalltalku.

Kód: [Vybrat]
r := ReadStream on: (1 to: 1000).
r next.   -→ 1
r next.   -→ 2
r atEnd.-→ false

Omg no ty budeš inteligent, to je ale naprosto jinaci situace, tam je samotny Stream implementovany formou iteratoru... Nejdrive se podivej, o cem je tady rec, a nebo pokud to vis, vrat diplom.

A v jave nie je stream iplementovany ako iterator?   Situacia je inaksia?  V com?

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #28 kdy: 28. 04. 2017, 22:36:23 »
Takže mýlka vznikla z toho důvodu, že ten ZipInputStream je Stream a zároveň iterátor. Je to špatný OOP návrh, který porušuje Single responsibility princip, v dokumentaci třídy není uvedeno, že se jedná o kočkopsa a proto mi nedošlo, jak se to má používat. Správné by bylo, kdyby ZipInputStream byl iterátor nad ZipEntry, a na ZipEntry by mělo getInputStream(). Ale pokud dělali Javu stejní kokodi, jako dělali SQL Developera, Eclipse a podobné, tak se není moc čemu divit.
Neumíte naprogramovat domácí úkol, který je možná i na dvacet řádků, neumíte si přečíst dokumentaci, ale hlavně že víte, jak by to mělo vypadat a co dělají všichni ostatní špatně.

Pro vaší informaci, ZipInputStream je potomek třídy FilterInputStream, která (překvapivě) funguje jako filtr, tj. na vstupu dostane jeden InputStream, vy s ní pracujete zase jako s InputStreamem a ta třída uvnitř provádí nějaké filtrování toho streamu. Chápu, že je to napsané až na pátém řádku dokumentace, a tak daleko jste nedočetl.

Ta třída existuje pravděpodobně „do počtu“ s ostatními třídami, které dělají (de)komprimaci nad streamy. Nejhorší na té třídě je, že vůbec existuje, nebo že u ní není uvedeno důrazné varování, že její použití je jen na vlastní nebezpečí a podrobné vysvětlení, co ta třída vlastně dělá. Protože ta třída čte jednotlivé položky ZIPu tak jak jsou v souboru uvedeny za sebou, a ignoruje adresář uložený na konci souboru. Přitom ale v tom adresáři je uvedeno, co je v tom ZIPu doopravdy. Když budete ZIP procházet pomocí ZipInputStreamu, můžete klidně rozbalit smazané soubory, starou verzi souboru nebo soubor budete mít špatně pojmenovaný. Což je podle mne mnohem horší než to, že si neumíte přečíst dokumentaci a nechápete, jak se ta třída používá.

Péťa

Re:Java a C# - porovnání práce se Zip souborem
« Odpověď #29 kdy: 29. 04. 2017, 00:10:42 »
Tam je totiž základní kravina v tom, že je tam vůbec nějaká třída umožňující procházet zip soubor implementovaná jako nějaký potomek InputStream, protože to má být spíše potomek Iterator. Toť věc první. Druhý problém, podstatně základnější, tam je v tom, že InputStream není napsán dostatečně abstraktně. Proto vůbec vznikla taková kravina, jako je FilteredInputStream.

InputStream by se totiž měl správně jmenovat ByteInputStream. Je to totiž, stejně jako v C#, proud nad typem byte. Správně, abstraktně implementovaná třída Stream, by měla být generická, s možnosti vybrat si, nad jakou jednotkou to stream vlastně je. Protože proud může být nad byte, nad soubory, nad ip pakety, nad tenisovými míčky nebo nad molekulami vody.

Takže tam je základní problém už v architektuře a C# to pak z Javy blbě okopíroval, takže svůj Stream impplementuje stejně blbě.

Podstatně blíže abstraktnímu pojetí streamu je totiž v podstatě Iterator. To je správně abstraktně napsaný Stream.

A teď k vám, pane Jirskáku. Nikdo netvrdí, že něco, co je Stream nad zip souborem, musí procházet i smazané soubory,. Stream je abstraktní věc. ValidZipInputStream by byl taky stream a vracel by klidně jen validní soubory podle té vaší zip složky. Na disku máte taky data fyzicky zapsány různě napřeskáčku a některé z nich jsou smazané, připadá vám však ale, že nad soubory pak fungují streamy nějak blbě? Takže si v tom udělajte pořádek pane Jirskáku, zamyslete, co jsou to vlastně streamy, máte už na to věk.

A teď zpátky od pana Jirsáka k Javě. Pokud to, co tvrdí trochu pomýlený pan Jirsák o ZipInputStream, je pravda, totiž že čte i nevalidní soubory v zip archivu a není to ani uvedeno v dokumentaci, tak je to, obávám se, ještě větší sračka, než si všichni mysleli, a nechci ani domýšlet, kolik tento paskvil, kterých je v Javě povícero, způsobil, za dobu své existence, škod v řádech milionů dolarů, a to na jen nejrůznějších chybách v produkci.