2016-05-24 10 views
0

Ich habe ein Objekt der StreamResource-Klasse mit einigen erforderlichen Inhalt darin. Ich bin mir sicher, dass dieser Inhalt gültig ist und ich ihn lokal für die weitere Verarbeitung speichern muss. Hier ist das Code-Snippet:Speichern Vaadin7 StreamResource in Datei

OutputStream os = new FileOutputStream(filePath, false); 

byte[] buffer = new byte[1024]; 
int bytesRead; 
//read from is to buffer 
try { 
    while(true) 
    { 
     bytesRead = resource.getStream().getStream().read(buffer); 
     if(bytesRead == -1) 
      break; 

     os.write(buffer, 0, bytesRead); 
     resource.getStream().getStream().skip(bytesRead); 
    } 
    os.flush(); 
    os.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Und hier schließe ich die Endlosschleife. Pause ist nie eingetreten und Datei an der benötigten Stelle wird so groß, wie es eigentlich sollte. Unter dem Debugger sehe ich, dass die Operation read() nur den ersten Teil der Bytes in jeder Iteration zurückgibt, sogar mit dem Aufruf skip() nach os.write.

Wie soll ich den Inhalt aus dem Stream lesen?

Danke.

+0

Was ist der Anwendungsfall? Laden Sie etwas in Ihre Vaadin App hoch? –

+0

Nein, ich erzeuge den Inhalt selbst. Kein Upload hier – user1053031

Antwort

1

Nach dem Quellcode StreamResource wird bei jedem Aufruf ein neuer DownloadStream erstellt. Sie sollten es nennen, wie es nur einmal im folgenden Ausschnitt:

OutputStream os = new FileOutputStream(filePath, false); 

byte[] buffer = new byte[1024]; 
int bytesRead; 
//read from is to buffer 
try { 
    DownloadStream stream = resource.getStream(); 
    while(true) 
    { 
     bytesRead = stream.getStream().read(buffer); 
     if(bytesRead == -1) 
      break; 

     os.write(buffer, 0, bytesRead); 
    } 
    os.flush(); 
    os.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Auf diese Weise wird der Strom nicht von Anfang an bei jeder Iteration gelesen werden. Ich verstehe jedoch immer noch nicht, warum Sie die Indirektion über StreamResource verwenden, da ich denke, dass Sie dieses Objekt zuvor erstellt haben.

+0

Danke für Ihre Antwort. Ich werde es ein bisschen später testen - jetzt bin ich weit weg von meinem Arbeitsumfeld. Es scheint, ich habe ein kleines exp. Arbeiten mit Streams (( – user1053031

+0

) Danke U! Das war der Punkt! – user1053031