2016-08-18 2 views
-1

Meine aktuelle Anwendung erfordert, Daten zu lesen und es dem Benutzer zu ermöglichen, es als Datei herunterzuladen. Server-Side-Code zu diesem ähnlich ist: https://stackoverflow.com/a/55788/3192744 Ich muss die Daten innerhalb INPUTSTREAM- meine aktuelle Methode Input zu erhalten ist:Wie werden Daten in Java InputStream abgelegt?

InputStream getIStream(){ 
    StringBuilder sb = new StringBuilder(); 
    String temp = “”; 
    while(//there is data to be read from database//){ 
      temp = //partial data or one entry from database 
      //some other modification in temp 
      sb.append(temp).append(“\n”); 
    } 
    exampleString = sb.toString(); 
    InputStream stream = new ByteArrayInputStream(exampleString.getBytes()); 
    } 

Diese Methode funktioniert für jetzt, da meine Daten sehr klein ist, etwa 1000 String, die jeweils etwa 100 Zeichen, also 100000 Zeichen. Bevor ich mit dem Download beginne, muss ich warten, bis ganze Daten in einer Zeichenfolge geschrieben sind. Auch wenn meine Datengröße zunimmt, passt sie nicht in eine Zeichenfolge. So ist es möglich, InputStream innerhalb der while-Schleife zu aktualisieren.

Und um diese Daten auf der Serverseite zu lesen, warte ich die Methode, InputStream zurückzugeben, so ist es möglich, InputStream als Methode Argument zu senden, und lesen Sie es während es aktualisiert wird.

Grundsätzlich möchte ich etwas wie eine Rohrleitung implementieren, wo modifizierte Strings von der Datenbank-Ausgabe gesendet werden, und auf der Empfängerseite werden Daten in die Datei für den Benutzer zum Download gestellt, und der Download-Prozess für Benutzer kann beginnen, während Daten wird aus der Datenbank gelesen.

+1

Ich weiß nicht, ob es Ihr Problem lösen würde, aber da Sie scheinen nur Textdaten zu schreiben werden Sie nutzen könnten Stattdessen wird der 'PrinterWriter' des Servlets aufgerufen, der die 'println (String str)' - Methode für jede abgerufene Teildatei aufruft. In diesem Fall rufen Sie den 'PrinterWriter' über' ServletResponse.getWriter() 'ab, anstatt' ServletResponse.getOutputStream() 'zu verwenden und müssen weder' StringBuilder' noch 'InputStream' verwenden. – Aaron

+0

Wie @Aaron sagte, Ihr Problem ist nicht ein 'InputStream'. Sie sollten einen 'OutputStream' (oder einen' Writer') bekommen, wo Sie die Daten ausgeben können, während Sie sie aus der Datenbank lesen. – Kayaman

Antwort

0

Das Problem ist, dass Sie alle Ihre Daten in eine StringBuilder aggregieren (und später in die InputStream, die Sie Ihre ServletOutputStream schreiben werden), während Sie stattdessen es auf dem Weg schreiben konnte.

Wie in meinem Kommentar erwähnt, empfehle ich die ServletResponse 's PrinterWriter anstelle von OutputStream, wenn Sie keine binären Daten ausgeben müssen, aber es würde alle gleich funktionieren.

Mit dem PrinterWriter:

PrinterWriter writer = ServletResponse.getWriter(); 
while(/*there is data to be read from database*/){ 
     temp = //partial data or one entry from database 
     //some other modification in temp 
     writer.println(temp); 
} 
writer.close(); 

Mit dem ServletOutputStream:

OutputStream out = ServletResponse.getOutputStream(); 
while(/*there is data to be read from database*/){ 
     temp = //partial data or one entry from database 
     //some other modification in temp 
     out.write(temp.getBytes()); 
     out.write('\n'); 
} 
out.close(); 
Verwandte Themen