Comment définir InputStream Longueur du contenu
Je suis le téléchargement de fichiers à compartiment Amazon S3. Les fichiers sont téléchargés, mais je reçois le message d'Avertissement suivant.
AVERTISSEMENT: Aucun contenu à la longueur spécifiée pour le flux de données. Diffuser du contenu
seront mis en mémoire tampon et peut entraîner des erreurs de mémoire insuffisante.
J'ai donc ajouté la ligne suivante dans mon code
metaData.setContentLength(IOUtils.toByteArray(input).length);
mais j'ai eu le message suivant. Je ne sais même pas si il s'agit d'un avertissement ou quoi.
De lecture de données a une longueur différente que prévu: dataLength=0;
expectedLength=111992; includeSkipped=false; dans.getClass()=la classe
soleil.net.httpserver.FixedLengthInputStream; markedSupported=false;
marqué=0; resetSinceLastMarked=false; markCount=0; resetCount=0
Comment puis-je définir contentLength pour les métadonnées de InputSteam? Toute aide serait grandement appréciée.
OriginalL'auteur Shaonline | 2016-03-24
Vous devez vous connecter pour publier un commentaire.
Quand vous lisez les données avec
IOUtils.toByteArray
, ce qui consomme de l'InputStream. Lorsque l'API AWS tente de le lire, c'est le zéro de la longueur.Lire le contenu dans un tableau d'octets et de fournir un InputStream habillage de tableau de l'API:
Dans ce cas, comment voulez-vous empêcher OOM de passe lorsque vous téléchargez un fichier volumineux?
Dans ce cas, vous devez faire un bloc (multipart) télécharger.
vous pouvez également écrire dans un fichier en premier pour éviter d'OOM
Par la mise en mémoire tampon de l'ensemble du flux de données en mémoire, cette solution ne fait que repeter manuellement ce que le SDK AWS déjà fait automatiquement, mais cette fois sans aucun avertissement imprimée! Pour une solution plus efficace, voir ma réponse ci-dessous.
OriginalL'auteur ataylor
Noter qu'en utilisant un ByteBuffer il vous suffit de faire manuellement ce que le SDK AWS déjà fait pour vous automatiquement! - Il encore tampons de l'ensemble du flux de données en mémoire et est aussi bon que l'original solution qui produit de l'avertissement à partir du SDK.
Vous pouvez seulement de se débarrasser de la mémoire de problème si vous avez une autre façon de connaître la longueur du cours d'eau, par exemple, lorsque vous créez un flux à partir d'un fichier:
OriginalL'auteur Robert Jack Will
Breaking News! AWS SDK 2.0 a un support intégré pour le téléchargement de fichiers:
Il y a aussi
RequestBody
des méthodes pour faire des Chaînes ou des Tampons qui automatiquement et efficacement le Contenu d'ensemble de la Longueur. Seulement quand vous avez un autre type de InputStream, vous avez encore besoin de fournir la longueur vous-même – toutefois que l'affaire devrait être plus rare maintenant, avec tous les autres options disponibles.OriginalL'auteur Robert Jack Will