Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Stahovanie cez javu, chybny archiv  (Přečteno 2345 krát)

existpierre

  • Host
Stahovanie cez javu, chybny archiv
« kdy: 18 Října 2009, 18:53:22 »
Zdravim,

hladal som uz snad vsade, nikde som nenasiel riesenie na moj problem. Mam tento kod:
Kód: [Vybrat]
            SwingWorker worker_update = new SwingWorker() {
                boolean all_ok = false;
                String file_name_str = DDirectory.getDataDirectory() + "update" + File.separator + "update.txt";
                @Override
                public Object construct() {

                    try {
                        int max = ua.getUpdateSize();
                        progressLoad.setMaximum(max);

                        progressLoad.setString("Pripájam...");
                        java.io.BufferedInputStream in = new java.io.BufferedInputStream(
                                new java.net.URL(
                                ua.getURLFileUpdateName()).openStream());
                        java.io.FileOutputStream fos = new java.io.FileOutputStream(file_name_str);
                        java.io.BufferedOutputStream bout = new BufferedOutputStream(fos, 1024);
                        byte data[] = new byte[1024];
                        int x = 0;
                        while (in.read(data, 0, 1024) >= 0) {
                            bout.write(data);
                            x++;
                            progressLoad.setValue(x);
                            if (x <= max) {
                                if (max < 1024) {
                                    progressLoad.setString("Sťahujem:  " + x + "KiB/" + max + "KiB");
                                } else {
                                    progressLoad.setString("Sťahujem:  " + x / 1024 + "MiB/" + max / 1024 + "MiB");
                                }
                            }
                        }
                        bout.close();
                        in.close();
                        all_ok = true;
                    } catch (Exception ex) {
                         all_ok = false;
                    }
                    return "";
                }
                @Override
                public void finished(){
                    File file = new File(file_name_str);
                    if (all_ok && file.exists() && file.length() > 200) {
                        progressLoad.setString(progressLoad.getString() + "   Update stiahnutý.");
                    }else{
                        progressLoad.setString("Nastala chyba pri sťahovaní!");
                    }
                }
            };
            worker_update.start();


tymto stiahnem subor do daneho priecinka ... vsetko prebehne ok, az na to, ze ak sa jedna o archiv, pri rozbalovani archivu mi vypise chybu Unexpected end of archive. A to iste co sa tyka *.jar suborov.. Lenze ak dam cez to stahovat nejaky txt subor, tak ho stiahne bez problemov.

Prosim, ak by sa tu nasiel niekto, kto by mi vedel poradit, pomoct, bol by som velmi vdacny



jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Stahovanie cez javu, chybny archiv
« Odpověď #1 kdy: 18 Října 2009, 19:26:17 »
Zdravím eXistPierre,

problém by mohl být v tom, že před uzavřením BufferedOutputStreamu jej nevyprázdníte metodou  bout.flush(), takže se nezapíšou všechna data , chybí konce archivů, což "rozbalovací " programy detekují.
Otázka je tak vypadá ten *.txt soubor co se daří uložit. Není naplněn na konci řadou znaků 'space'?
Čili zkuste před
Kód: [Vybrat]
bout.close(); zařadit
Kód: [Vybrat]
bout.flush();
« Poslední změna: 18 Října 2009, 22:48:27 od jfoot »
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

petergula

  • Stálý člen
  • **
  • Příspěvků: 1016
Re: Stahovanie cez javu, chybny archiv
« Odpověď #2 kdy: 20 Října 2009, 13:18:08 »
no flush() podla mna problem asi ani nebude, lebo metoda close() zavola flush explicitne, vid kod triedy java.io.BufferedOutputStream:
Kód: [Vybrat]
public void close() throws IOException {
try {
  flush();
} catch (IOException ignored) {
}
out.close();
    }

by som sa pozrel na:
Kód: [Vybrat]
while (in.read(data, 0, 1024) >= 0) {
                            bout.write(data);
...
, konkretne metoda read a write. Pri read nikde nie je napisane, ze nacita vsetkych 1024 bytes, ale len, ze nacita maximalne 1024bytes. To kolko nacitalo mas v premennej, co metoda read vrati, takze skor by som pouzil:
Kód: [Vybrat]
while((bytes_read = in.read(buffer)) != -1)
        out.write(buffer, 0, bytes_read);
napr. cely example na http://examples.oreilly.com/9781565923713/GetURL.java samozrejme bez tvojich aktualizacii progress baru.
ntbk Dell 6420 (Amd Ati, Intel i7, 4GB RAM, 256GB SSD ...)
secondary/u svokrovcov:
Xubuntu (64bit) ntbk Asus A6Je (Ati X1450, Intel Core2Duo T5500, 2.5GB RAM ...)

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Stahovanie cez javu, chybny archiv
« Odpověď #3 kdy: 22 Října 2009, 11:14:25 »
Zdravím petergula and eXistPierre,

no flush() podla mna problem asi ani nebude, lebo metoda close() zavola flush explicitne, vid kod triedy java.io.BufferedOutputStream:
Kód: [Vybrat]
public void close() throws IOException {
try {
  flush();
} catch (IOException ignored) {
}
out.close();
    }

Ano máte pravdu. Ve zdrojácích to tak je a z tohoto pohledu je skutečně irelevantní to, co jsem psal ve svém předchozím příspěvku.
  Já teď bohužel nemám čas se problému věnovat , byť mě zajímá, ->pracovní vytížení a aby toho nebylo málo i potíže s připojením k netu... >:( a navíc i potíže s ntb, který mě žíví, včera mi doslova upadl z pantu display... :(  :(  :( a nový ještě nemám úplně zprovozněný... už aby tady ta 9.10 byla... :P

V mezičase při kávě u krbu : tady je zajímavá diskuse na téma metody flush() v Javě :
http://forum.builder.cz/read.php?14,3004859,3025607

However,btw,eXistPierre, dejte někdy vědět , jestli jste to vyřešil nebo ne,  jak Vám chodí řešení, které navrhnul petergula  anebo jaký je stav problému...
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

existpierre

  • Host
Re: Stahovanie cez javu, chybny archiv
« Odpověď #4 kdy: 01 Listopadu 2009, 23:12:12 »
Ospravedlnujem sa ze som neodpisal, dlho som tu totiz nebol a zrejme so zabudol zapnut upoz .. takze kod vypada takto, Neivem ale ci je problem inde ako tu v jave ... totizto ja uploadujem na jabbim server cez jabbim klienta ... mno a niekedy mi pri rozblaovani po stahovani da chybu a niekedy nie. Ci nie je problem v tom uploade na jabbim server ... ale divne mi je ze aj ked da chybu, normalne cez rar to rozbalit ide.

Kód: [Vybrat]
           SwingWorker worker_update = new SwingWorker() {

                boolean all_ok = false;
                String file_name_str = RootDirectory.getDataDirectory() + "update" + File.separator + "update.zip";
                @Override
                public Object construct() {

                    try {
                        int max = ua.getUpdateSize();
                        progressLoad.setMaximum(max);

                        progressLoad.setString("Pripájam...");
                        java.io.BufferedInputStream in = new java.io.BufferedInputStream(
                                new java.net.URL(
                                ua.getURLFileUpdateName()).openStream());
                        java.io.FileOutputStream fos = new java.io.FileOutputStream(file_name_str);
                        java.io.BufferedOutputStream bout = new BufferedOutputStream(fos, 1024);
                        byte buf[] = new byte[1];//buffer
                        int dl_byte = 0;
                        int bytesRead = 0;
                        while ((bytesRead = in.read(buf)) != -1) {
                            bout.write(buf,0, bytesRead);
                            dl_byte++;
                            progressLoad.setValue(dl_byte);
                            if (dl_byte <= max) {
                                if (max > UpdateApp.SIZE_KILOBYTE && max < UpdateApp.SIZE_MEGABYTE) {
                                    progressLoad.setString("Sťahujem:  " + dl_byte / UpdateApp.SIZE_KILOBYTE + "KiB/" +
                                            max / UpdateApp.SIZE_KILOBYTE + "KiB");
                                } else if (max > UpdateApp.SIZE_MEGABYTE) {
                                    progressLoad.setString("Sťahujem:  " + dl_byte / UpdateApp.SIZE_MEGABYTE + "MiB/" +
                                            max / UpdateApp.SIZE_MEGABYTE + "MiB");
                                }
                            }
                        }
                        bout.close();
                        in.close();
                        all_ok = true;
                    } catch (Exception ex) {
                        all_ok = false;
                        ex.printStackTrace();
                        DialogMessages.DialogErr("Chyba pri sťahovaní súboru!");
                    }
                    return "";
                }
« Poslední změna: 01 Listopadu 2009, 23:15:22 od eXistPierre »

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Stahovanie cez javu, chybny archiv
« Odpověď #5 kdy: 09 Listopadu 2009, 10:10:37 »
Zdravím eXistPierre,

předpokládám, že ta chyba, co popisujete, není chybou, zachycenou kdekoliv v Javě (v klauzuli catch).  Podle toho , co jste popsal a podle code to vypadá, že code pro fyzický přenos celého souboru je OK. Neleží ten problém v synchronizaci vláken (když používáte třídu SwingWorker), prostě že vlákno, které vyhodnocuje stav uploadu vyhodnotí tento stav chybně  (což je interpretováno hlášením , že došlo k chybě)  tedy vyhodnotí jej dříve/později než to upload vlákno dokončí činnost ?
Pokud jsou ty upload soubory někdy fyzicky po přenosu přerušeny a není v logu zachycena žádná runtime chyba týkající se přenosu toho chybného souboru, není tu, kromě SwingWorkera někdo další, kdo by zasáhnul do přenesu i jen někdy ?
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

existpierre

  • Host
Re: Stahovanie cez javu, chybny archiv
« Odpověď #6 kdy: 09 Listopadu 2009, 11:25:27 »
to pochybujem, kedze je to ako jedine vlakno ktore s tym suborom pracuje a vlastne v construct() mam stahovanie a az vo finished() mam rozbalovanie, cize imo je tymto sync zabezpecene. Neprekryva sa to nicim. Tiez som nad tym  rozmyslal. pastnem to sem cele:


Kód: [Vybrat]
 public WindowListener listener = new WindowAdapter() {

        @Override
        public void windowOpened(WindowEvent evt) {

            SwingWorker worker_update = new SwingWorker() {

                boolean all_ok = false;
                int max = 0;
                String file_name_str = RootDirectory.getDataDirectory() + "update" + File.separator + "update.zip";
                @Override
                public Object construct() {

                    try {
                         max = ua.getUpdateSize();
                        progressLoad.setMaximum(max);

                        progressLoad.setString("Pripájam...");
                        java.io.BufferedInputStream in = new java.io.BufferedInputStream(
                                new java.net.URL(
                                ua.getURLFileUpdateName()).openStream());
                        java.io.FileOutputStream fos = new java.io.FileOutputStream(file_name_str);
                        java.io.BufferedOutputStream bout = new BufferedOutputStream(fos, 1024);
                        byte buf[] = new byte[1];//buffer
                        int dl_byte = 0;
                        int bytesRead = 0;
                        while ((bytesRead = in.read(buf)) != -1) {
                            bout.write(buf,0, bytesRead);
                            dl_byte++;
                            progressLoad.setValue(dl_byte);
                            if (dl_byte <= max) {
                                if (max > UpdateApp.SIZE_KILOBYTE && max < UpdateApp.SIZE_MEGABYTE) {
                                    progressLoad.setString("Sťahujem:  " + dl_byte / UpdateApp.SIZE_KILOBYTE + "KiB/" +
                                            max / UpdateApp.SIZE_KILOBYTE + "KiB");
                                } else if (max > UpdateApp.SIZE_MEGABYTE) {
                                    progressLoad.setString("Sťahujem:  " + dl_byte / UpdateApp.SIZE_MEGABYTE + "MiB/" +
                                            max / UpdateApp.SIZE_MEGABYTE + "MiB");
                                }
                            }
                        }
                        bout.close();
                        in.close();
                        all_ok = true;
                    } catch (Exception ex) {
                        all_ok = false;
                        ex.printStackTrace();
                        DialogMessages.DialogErr("Chyba pri sťahovaní súboru!");
                    }
                    return "";
                }

                @Override
                public void finished() {
                    File file = new File(file_name_str);
                    if (all_ok && file.exists() && file.length() == max) {
                        progressLoad.setString(progressLoad.getString() + "   Update stiahnutý.");
                        SwingWorker w_unzip = new SwingWorker() {

                            @Override
                            public Object construct() {
                                try {
                                    FilePaths fp = new FilePaths();
                                    ZipFile zf = new ZipFile(file_name_str);
                                    Enumeration e = zf.entries();
                                    while (e.hasMoreElements()) {
                                        ZipEntry ze = (ZipEntry) e.nextElement();
                                        statusProcess.setText(statusProcess.getText() +
                                                "Rozbaľujem " + ze.getName() + "...\n");

                                        FileOutputStream fout = new FileOutputStream(fp.getFilePath(ze.getName()));
                                        File f = new File("");
                                        
                                        InputStream in = zf.getInputStream(ze);
                                        for (int c = in.read(); c != -1; c = in.read()) {
                                            fout.write(c);
                                        }
                                        in.close();
                                        fout.close();
                                    }
                                } catch (Exception ex) {
                                    DialogMessages.DialogErr("Nemôžem nahradiť súbory. Zrejme poškodený archív s updatom");
                                    ex.printStackTrace();
                                }
                                return "";
                            }

                            @Override
                            public void finished() {
                                statusProcess.setText(statusProcess.getText() +
                                                "Súbory sú rozbalené.\n" +
                                                "Aktualizácia ukončená. Možete pustit znovu aplikáciu.");

                            SwingWorker worker_update = new SwingWorker() {

                                @Override
                                public Object construct() {
                                    AppOptions ao = new AppOptions();
                                    ao.saveOption(ao.WAS_UPDATE, "1");
                                    ao.writeFile();
                                    String app_file = "ISHS.jar";

                                    String command = "cmd /c java -jar " + app_file;
                                    try {
                                        Process p = Runtime.getRuntime().exec(command);
                                    } catch (Exception ex) {
                                        DialogMessages.DialogErr("Chyba pri spustení aplikácie! ");
                                    }
                                    return "";
                                }
                            };
                            worker_update.start();
                            System.exit(1);
                            }
                        };
                        w_unzip.start();
                    } else {
                        progressLoad.setString("Nastala chyba pri sťahovaní!");
                    }
                }
            };
            worker_update.start();
        }

        @Override
        public void windowClosing(WindowEvent e) {
            super.windowClosing(e);

        }
    };

pre lepsi obraz, funguje to takto: <a href="http://www.youtube.com/watch?v=mSSTJwXI7cU" target="_blank">http://www.youtube.com/watch?v=mSSTJwXI7cU</a>
« Poslední změna: 09 Listopadu 2009, 11:29:05 od eXistPierre »

petergula

  • Stálý člen
  • **
  • Příspěvků: 1016
Re: Stahovanie cez javu, chybny archiv
« Odpověď #7 kdy: 09 Listopadu 2009, 16:08:49 »
Citace
mno a niekedy mi pri rozblaovani po stahovani da chybu a niekedy nie.
tak sem dajte vypis tej chyby, ak to rozbalujete v jave a vzorku toho chybneho raru.
Citace
ale divne mi je ze aj ked da chybu, normalne cez rar to rozbalit ide.
takze rar subor to stiahne v poriadku? porovnal ste ho binarne, co posielate na vstup a co mate na vystupe?

Co sa tyka swingu, nikdy neviete na 100%, co je ako volane vo vlaknach :) (to som asi az trosku prehnal).

este nejake dotazy:
- spadne Vam to tu
Kód: [Vybrat]
DialogMessages.DialogErr("Chyba pri sťahovaní súboru!"); alebo tu
Kód: [Vybrat]
DialogMessages.DialogErr("Nemôžem nahradiť súbory. Zrejme poškodený archív s updatom");
?

- stale nevieme, kedy volate construct() a finished() lebo nevieme, co trieda SwingWorker obsahuje, ta ktoru rozsirujete vo svojom poskytnutom zdrojaku.

- ... dalsie otazky neskor ked zodpovies tieto, inak dobre som si vsimol, ze v SwingWorker triede volas new SwingWorker vo finished metode a v nej zasa dalsi SwingWorker? Je to potom super citatelny kod :), ale to ber len ako moj nazor, lebo uz som Ti dvakrat asi vytykal, ze ako formatujes, ake nazvy metod pouzivas ..., proste si zvyknuty na iny standard, dufam, ze sa v tom lepsie vyznas ako ja teraz ked ma uz treti krat rozbolela hlava :).
ntbk Dell 6420 (Amd Ati, Intel i7, 4GB RAM, 256GB SSD ...)
secondary/u svokrovcov:
Xubuntu (64bit) ntbk Asus A6Je (Ati X1450, Intel Core2Duo T5500, 2.5GB RAM ...)

 

Provoz zaštiťuje spolek OpenAlt.