Sto lavorando a un'applicazione web java in cui i file verranno archiviati in un database. Originariamente abbiamo recuperato i file già nel DB semplicemente chiamando getBytes
sul nostro set di risultati:Come convertire un InputStream in un DataHandler?
byte[] bytes = resultSet.getBytes(1);
...
Questo array di byte è stato poi convertito in un DataHandler
utilizzando il costruttore ovvia:
dataHandler=new DataHandler(bytes,"application/octet-stream");
Questo ha funzionato bene fino a quando abbiamo ha iniziato a provare a memorizzare e recuperare file più grandi. Scaricando l'intero contenuto del file in un array di byte e creando quindi un DataHandler
, è sufficiente disporre di troppa memoria.
La mia idea immediata è di recuperare un flusso di dati nel database con getBinaryStream
e in qualche modo convertire tale InputStream
in un DataHandler
in modo efficiente dalla memoria. Sfortunatamente non sembra che ci sia un modo diretto per convertire un InputStream
in un DataHandler
. Un'altra idea con cui ho giocato è la lettura di blocchi di dati dallo InputStream
e la loro scrittura nello OutputStream
dello DataHandler
. Ma ... Non riesco a trovare un modo per creare un "vuoto" DataHandler
che restituisce un valore non nullo OutputStream
quando chiamo getOutputStream
...
Qualcuno ha fatto questo? Apprezzerei qualsiasi aiuto tu possa darmi o guidi nella giusta direzione.
Ah, che è una grande idea. Ci proverò quando avrò la possibilità. – pcorey
Ho pensato la stessa cosa. Ma attenzione, allora il DataHandler deve essere usato (consuma il suo input), "inside you loop", mentre il ResultSet è aperto. Ad esempio, non puoi probabilmente passare l'oggetto DataHandler a un livello superiore. – leonbloy
@leonbloy L'obiettivo dichiarato era elaborare i dati senza copiarli dal set di risultati. Ciò implica che il set di risultati deve essere aperto per tutto il tempo indipendentemente da come lo si fa. –