Ich arbeite an einer Java-Webanwendung, in der Dateien in einer Datenbank gespeichert werden. Ursprünglich abgerufen wir Dateien bereits in der DB durch einfache getBytes
auf unserer Ergebnismenge Aufruf:Wie konvertiert man einen InputStream in einen DataHandler?
byte[] bytes = resultSet.getBytes(1);
...
Dieser Byte-Array dann ein in DataHandler
umgewandelt wurde, das Offensichtliche Konstruktor:
dataHandler=new DataHandler(bytes,"application/octet-stream");
Das funktionierte großartig, bis wir begann zu versuchen, größere Dateien zu speichern und abzurufen. Den gesamten Dateiinhalt in ein Byte-Array zu packen und dann daraus einen DataHandler
zu bauen, benötigt einfach zu viel Speicher.
Meine unmittelbare Idee ist es, einen Strom der Daten in der Datenbank mit getBinaryStream
abrufen und irgendwie konvertieren InputStream
in eine DataHandler
auf eine speichereffiziente Weise. Leider scheint es keinen direkten Weg zu geben, eine InputStream
in eine DataHandler
umzuwandeln. Eine andere Idee, mit der ich gespielt habe, ist das Lesen von Datenbrocken aus der InputStream
und das Schreiben dieser Daten in die OutputStream
der DataHandler
. Aber ... Ich kann keinen Weg finden, eine "leere" DataHandler
zu erstellen, die eine nicht null OutputStream
zurückgibt, wenn ich getOutputStream
anrufen ...
Hat jemand dies getan? Ich würde mich über jede Hilfe freuen, die Sie mir geben oder in die richtige Richtung führen können.
Ah, das ist eine großartige Idee. Ich werde es versuchen, wenn ich eine Chance bekomme. – pcorey
Ich dachte das Gleiche. Aber Vorsicht, dass dann der DataHandler verwendet werden muss (konsumiere seine Eingabe), "inside you loop", während das ResultSet geöffnet ist. Beispielsweise können Sie das DataHandler-Objekt wahrscheinlich nicht an eine höhere Ebene übergeben. – leonbloy
@leonbloy Das erklärte Ziel war, die Daten zu verarbeiten, ohne sie aus der Ergebnismenge zu kopieren. Dies bedeutet, dass die Ergebnismenge die ganze Zeit geöffnet sein muss, unabhängig davon, wie Sie es tun. –