Je travaille sur une application web Java dans laquelle les fichiers seront stockés dans une base de données. A l'origine nous avons récupéré les fichiers déjà dans la base de données en appelant simplement getBytes
sur notre jeu de résultats:Comment convertir un InputStream en DataHandler?
byte[] bytes = resultSet.getBytes(1);
...
Ce tableau d'octets a ensuite été converti en un DataHandler
utilisant le constructeur évident:
dataHandler=new DataHandler(bytes,"application/octet-stream");
Cela a très bien fonctionné jusqu'à ce que nous commencé à essayer de stocker et de récupérer des fichiers plus volumineux. Déposer tout le contenu du fichier dans un tableau d'octets, puis en construire un DataHandler
nécessite simplement trop de mémoire.
Mon idée immédiate est de récupérer un flux de données dans la base de données avec getBinaryStream
et de convertir en quelque sorte ce InputStream
en un DataHandler
d'une manière efficace de la mémoire. Malheureusement, il ne semble pas y avoir de moyen direct de convertir un InputStream
en un DataHandler
. Une autre idée avec laquelle j'ai joué est de lire des morceaux de données du InputStream
et de les écrire sur le OutputStream
du DataHandler
. Mais ... je ne peux pas trouver un moyen de créer un "vide" DataHandler
qui renvoie un non-nul OutputStream
quand j'appelle getOutputStream
...
Quelqu'un at-il fait cela? J'apprécierais toute aide que vous pourriez me donner ou diriger dans la bonne direction.
Ah, c'est une excellente idée. Je vais essayer quand j'ai une chance. – pcorey
Je pensais la même chose. Mais attention, alors le DataHandler doit être utilisé (consomme son entrée), "inside you loop", tandis que le ResultSet est ouvert. Par exemple, vous ne pouvez probablement pas passer l'objet DataHandler à une couche supérieure. – leonbloy
@leonbloy L'objectif déclaré était de traiter les données sans les copier à partir du jeu de résultats. Cela implique que le jeu de résultats doit être ouvert tout le temps, peu importe comment vous le faites. –