Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    stringa da file .txt in zip

    ciao .
    Ho trovato questo esempio di codice su google:
    codice:
        try
              {
                 byte[] data = new byte[1000];
                 int byteRead;
               
                 BufferedOutputStream bout = null;
                 ZipInputStream  zin = new ZipInputStream(new BufferedInputStream(new ByteArrayInputStream(Data)));
                 ZipEntry entry;
                 StringBuffer buff = new StringBuffer();
                 while((entry = zin.getNextEntry()) != null)
                 {
                     byteRead=0;
                     data = new byte[1000];
                     String strPath = m_context.getApplicationContext().getFilesDir() + "/dbs/"+entry.getName();
                     bout = new BufferedOutputStream(new FileOutputStream(strPath,true),1000);
                     while ((byteRead = zin.read(data,0,1000)) != -1)
                     {
                         buff.append(new String((byte[])data, "UTF-8"));
                         bout.write(data,0,byteRead);
                     }
                    
                     String str = buff.toString();
                     
                     bout.flush();
                     bout.close();
                 }
                 m_finish.finish();
              }
             catch(Exception e)
              {
             e.printStackTrace();
              }
    io vorrei recuperare direttamente la stringa unzippata(del primo e unico file che avro') e senza salvare il file e ho fatto una prova con lo StringBuffer e l'append utilizzando il costruttore della stringa che prende byte e utf-8.
    Il problema è che la stringa risultante non è completa, dove sbaglio?
    ho usato uno StringBuffer perchè ho letto che è thread safe invece dello StringBuilder ma il problema non è li'.

    grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giuseppe500 Visualizza il messaggio
    io vorrei recuperare direttamente la stringa unzippata(del primo e unico file che avro') e senza salvare il file e ho fatto una prova con lo StringBuffer e l'append utilizzando il costruttore della stringa che prende byte e utf-8.
    Il problema è che la stringa risultante non è completa, dove sbaglio?
    Innanzitutto un codice tipo:

    buff.append(new String((byte[])data, "UTF-8"));

    non è proprio correttissimo. Il punto è che in UTF-8 un carattere può essere rappresentato con più byte. Creare stringhe distinte da blocchetti di byte senza sapere a che punto eventualmente interrompono una sequenza multi-byte può essere un problema per il decoder interno. Anche se nel tuo caso specifico non ci fossero questi problemi, è comunque una cosa non molto bella e pulita.

    Se il documento sai a priori che non è molto grosso, puoi "buttare" i byte a blocchi dentro un ByteArrayOutputStream, poi alla fine crei un String con tutto l'array di byte indicando il charset che ovviamente deve essere coerente con il contenuto del documento.

    Altrimenti, vale in generale e sarebbe anche meglio, incapsulare il zin in un InputStreamReader (specificando charset), poi leggere a blocchi di char e buttarli nel StringBuffer.

    Quote Originariamente inviata da giuseppe500 Visualizza il messaggio
    ho usato uno StringBuffer perchè ho letto che è thread safe invece dello StringBuilder ma il problema non è li'.
    Qui non centra la thread-safety ... il tuo StringBuffer è "locale", non è condiviso tra thread! Quindi non centrano questioni con i thread.
    Ultima modifica di andbin; 23-11-2013 a 16:44
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie andbin, devo specificare 2 cose:
    1)lavoro in android e vado a caricare il mio file da un url web, e il processo è gestito da una libreria che crea un thread a parte e lavora in modo asincrono è per questo che ho pensato al thread safe, o non centra nulla comunque?
    La libreria l'ho postata nel thread preecedente
    2)il file puo arrivare ad essere anche 20MB e di questo file devo fare un parsing come posso fare tutto nel modo piu sicuro possibile?al limite anche salvando il file e riaprendolo; E' meglio spezzare la lettura in blocchi di stringhe e fare il pharsing di questo? devo infatti ricercare delle sottostringhe nel file, le sottostringhe sono di questo genere : (è il dump di solo dati di un db mysql)

    insert into(a,b,c) values(1,2,3);
    insert into(a,b,c) values(4,5,6);
    insert into(a,b,c) values(7,8,9);


    3)alla fine forse la cosa migliore è leggere il file linea per linea , o c'è qualcosa di possibilmente piu veloce?

    grazie.
    ps.
    in questo modo funziona:
    codice:
         Reader      reader      = new InputStreamReader(zin, "UTF-8");
                      
                      int data = reader.read();
                      while(data != -1){
                          buff.append((char) data);
                          data = reader.read();
                      }
    
                      String str = buff.toString();
    ma è estremamente lento.
    ciao.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giuseppe500 Visualizza il messaggio
    1)lavoro in android e vado a caricare il mio file da un url web, e il processo è gestito da una libreria che crea un thread a parte e lavora in modo asincrono è per questo che ho pensato al thread safe, o non centra nulla comunque?
    La libreria l'ho postata nel thread preecedente
    Non centra comunque nulla. Come ho detto prima, il tuo StringBuffer è una variabile locale, se anche più thread eseguissero quel tuo pezzo di codice, ogni thread avrebbe il suo StringBuffer. Non c'è condivisione = nessun problema di concorrenza.
    Tra StringBuffer e StringBuilder ti conviene però quest'ultimo. E ripeto, non per problemi di "concorrenza" ma perché la istanza di StringBuffer pur essendo usata da un solo thread, richiede comunque l'acquisizione di un "lock" (StringBuffer è synchronized) mentre StringBuilder no.

    Quote Originariamente inviata da giuseppe500 Visualizza il messaggio
    2)il file puo arrivare ad essere anche 20MB e di questo file devo fare un parsing come posso fare tutto nel modo piu sicuro possibile?al limite anche salvando il file e riaprendolo; E' meglio spezzare la lettura in blocchi di stringhe e fare il pharsing di questo? devo infatti ricercare delle sottostringhe nel file, le sottostringhe sono di questo genere : (è il dump di solo dati di un db mysql)

    insert into(a,b,c) values(1,2,3);
    insert into(a,b,c) values(4,5,6);
    insert into(a,b,c) values(7,8,9);


    3)alla fine forse la cosa migliore è leggere il file linea per linea , o c'è qualcosa di possibilmente piu veloce?

    grazie.
    ps.
    in questo modo funziona:
    codice:
         Reader      reader      = new InputStreamReader(zin, "UTF-8");
                      
                      int data = reader.read();
                      while(data != -1){
                          buff.append((char) data);
                          data = reader.read();
                      }
    
                      String str = buff.toString();
    ma è estremamente lento.
    Io infatti avevo detto "leggere a blocchi di char e buttarli nel StringBuffer". Non 1 char per volta (che ovviamente è molto meno performante).

    Comunque se devi fare il parsing di ciascuna riga per volta (cioè non c'è una qualche connessione tra più righe), allora leggi "a righe":
    zin -> InputStreamReader -> BufferedReader
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    capito, grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.