110 votes

Déterminer la taille d'un InputStream

Ma situation actuelle est la suivante : je dois lire un fichier et placer le contenu dans InputStream. Ensuite, je dois placer le contenu de InputStream dans un tableau de bytes, ce qui nécessite (autant que je sache) la taille de InputStream. Des idées ?

Comme demandé, je vais montrer le flux d'entrée que je crée à partir d'un fichier téléchargé

InputStream uploadedStream = null;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
java.util.List items = upload.parseRequest(request);      
java.util.Iterator iter = items.iterator();

while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    if (!item.isFormField()) {
        uploadedStream = item.getInputStream();
        //CHANGE uploadedStreambyte = item.get()
    }
}

La requête est un objet HttpServletRequest, qui est similaire au FileItemFactory et ServletFileUpload issus du paquet Apache Commons FileUpload.

88voto

W. B. Reed Points 75

Ceci est un fil de discussion VRAIMENT vieux, mais c'était quand même la première chose à apparaître lorsque j'ai googlé le problème. Je voulais juste ajouter ceci :

InputStream inputStream = conn.getInputStream();
int length = inputStream.available();

A fonctionné pour moi. Et BEAUCOUP plus simple que les autres réponses ici.

Avertissement Cette solution ne fournit pas des résultats fiables concernant la taille totale d'un flux. Sauf indication contraire dans la JavaDoc :

Notez que tandis que certaines implémentations de {@code InputStream} retourneront le nombre total d'octets dans le flux, beaucoup ne le feront pas.

46voto

Brian Agnew Points 143181

Je lirais dans un ByteArrayOutputStream puis j'appellerais toByteArray() pour obtenir le tableau de bytes résultant. Vous n'avez pas besoin de définir la taille à l'avance (bien que ce soit probablement une optimisation si vous la connaissez. Dans de nombreux cas, ce ne sera pas le cas)

25voto

Andrew Duffy Points 3574

Vous ne pouvez pas déterminer la quantité de données dans un flux sans le lire; vous pouvez cependant demander la taille d'un fichier :

[http://java.sun.com/javase/6/docs/api/java/io/File.html#length()](http://java.sun.com/javase/6/docs/api/java/io/File.html#length())

Si ce n'est pas possible, vous pouvez écrire les octets que vous lisez du flux d'entrée dans un ByteArrayOutputStream qui augmentera selon les besoins.

17voto

kd304 Points 8369

Je voulais juste ajouter, Apache Commons IO a des utilitaires de support de flux pour effectuer la copie. (Au fait, que voulez-vous dire par placer le fichier dans un inputstream? Pouvez-vous nous montrer votre code?)

Modifier:

D'accord, que voulez-vous faire avec le contenu de l'élément? Il y a un item.get() [qui retourne](http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/FileItem.html#get()) tout en tableau d'octets.

Modifier2

item.getSize() retournera la [taille du fichier](http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/FileItem.html#getSize()) téléchargé.

9voto

amstegraf Points 202

Pour InputStream

org.apache.commons.io.IoUtils.toByteArray(inputStream).length()

Pour Optionnel < MultipartFile >

Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X