Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JAVA] problema con gli stream in una servlet

    ciao a tutti.

    in una servlet che passa un file per il download ho questo codice:

    codice:
                
    String path //percors del file da passare al browser
    String type = //mimetype
    if (type != null) type = "application/x-download";
    response.setHeader("Content-Disposition", "attachment; filename=" + path.substring(path.lastIndexOf(File.separator)+1));
    
    response.setContentType(type);
    ServletOutputStream out = response.getOutputStream();
    BufferedInputStream in = null;
    try {
         in = new BufferedInputStream(new ZipInputStream(new FileInputStream(path)));
    }catch(Exception e){
         logger.error(e.getLocalizedMessage());
    }
    try{
         if (in != null) {
                while (in.available()>0){
                      out.write(in.read());
                }
                in.close();
                out.close();
          }
    }catch(Exception e){
         logger.error(e.getLocalizedMessage());
    }

    il problema e- che in.available() non sembra fare il suo mestiere, o meglio, il while va in loop e continua a spararmi un stream. ho provato a controlalre su una variabile int.
    codice:
     
    int d = 0;
    while (d>-1){
        d = in.read();
        out.write(d);
    }
    ma mi legge solo una volta prima di uscire dal while...

    consigli?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Potresti provare con:
    codice:
    int d;
    if (in != null) {
        while ((d = in.read() > -1) {
            out.write(d);
        }
        in.close();
        out.close();
        }
    }
    Utilizzare il metodo available come condizione di uscita dal
    bloccco while non mi sembra una gran cosa.
    Slack? Smack!

  3. #3
    Originariamente inviato da Sergio Pedone
    Potresti provare con:
    codice:
    int d;
    if (in != null) {
        while ((d = in.read() > -1) {
            out.write(d);
        }
        in.close();
        out.close();
        }
    }
    Utilizzare il metodo available come condizione di uscita dal
    bloccco while non mi sembra una gran cosa.
    e tu che useresti?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Quello chi ti ho appena scritto.
    available restituisce il numero di byte che possono essere
    letti
    dallo stream senza andare in blocking.

    Ecco cosa dicono le API:
    codice:
    available
    
    public int available()
                  throws IOException
    
        Returns the number of bytes that can be read from this 
    input stream without blocking.
    
        The available method of BufferedInputStream returns the
    sum of the the number of bytes remaining to be read in the 
    buffer (count - pos) and the result of calling the available
    method of the underlying input stream.
    
        Overrides:
            available in class FilterInputStream
    
        Returns:
            the number of bytes that can be read from this input
     stream without blocking. 
        Throws:
            IOException - if an I/O error occurs.
        See Also:
            FilterInputStream.in
    Spero ti possa servire.

    Slack? Smack!

  5. #5
    assomiglia molto a un test che ho gia- fatto e che non andava. adesso provo poi ti dico, comunque vada grazie mille

  6. #6
    appunto. non va.

    mi crea un file di 0 byte.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Aspetta ancora un attimino.
    Ho provato ad utilizzare anche available su un piccolo esempio
    e funziona egregiamente.

    codice:
    import java.io.*;
    
    public class StampaFile {
    
            // il file da leggere e stampare
            String file;
    
            public StampaFile(String filename) {
                    this.setFile(filename);
            }
    
            public void setFile(String filename) {
                    file = filename;
            }
    
            public void stampa() {
                    try {
                            FileInputStream fis = new FileInputStream(file);
                            BufferedInputStream bis = new BufferedInputStream(fis);
                            int i;
                            //while ( (i = bis.read()) != -1 ) {
                            while (bis.available() > 0) {
                                    i = bis.read();
                                    System.out.print("" + (char)i);
                            }
                            bis.close();
                    } catch (IOException e) {
                            System.out.println("Message: " + e.getLocalizedMessage());
                    }
            }
    
            public static void main(String[] args) {
                    new StampaFile(args[0]).stampa();
            }
    }
    Lo lancio dandogli in pasto un file di testo, ad esempio
    il sorgente di questa classe.

    Provalo, vedi se ti può interessare, dopodichè cura la
    tua servlet.

    Ciao.
    Slack? Smack!

  8. #8
    onestamente non vedo differenze sostanziali dal mio primo post, a parte il fatto che il tuo e- un file di testo e il mio uno zip... :master:

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Ho provato anche l'out e funziona:
    codice:
            public void stampa() {
                    try {
                            FileInputStream fis = new FileInputStream(file);
                            BufferedInputStream bis = new BufferedInputStream(fis);
                            BufferedOutputStream bos = new BufferedOutputStream(System.out);
                            int i;
                            //while ( (i = bis.read()) != -1 ) {
                            while (bis.available() > 0) {
                                    i = bis.read();
                                    //System.out.print("" + (char)i);
                                    bos.write(i);
                            }
                            bos.flush();
                            bos.close();
                            bis.close();
                    } catch (IOException e) {
                            System.out.println("Message: " + e.getLocalizedMessage());
                    }
            }
    Adesso scappo perchè tengo una fame bestia.
    Magari più tardi provo a dargli un'altra occhiata.
    Slack? Smack!

  10. #10
    ho ottenuto dei risultati migliori con i FileWriter. effettivamente mi crea un file .zip

    il comando file di linux mi dice che e- uno zip ma tar non me lo scompatta.
    ci deve essere un casino riguardo al fatto che lo passo a un PrintWriter, esendo in una servlet...

    consigli?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.