web-dev-qa-db-fra.com

Déterminer la taille d'un InputStream

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

Comme demandé, je montrerai 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 demande est un objet HttpServletRequest, qui ressemble au type FileItemFactory et ServletFileUpload du paquet Apache Commons FileUpload.

49
ChronoXIII

Je voulais juste ajouter qu'Apache Commons IO possède des utilitaires de support de flux pour effectuer la copie. (Btw, que voulez-vous dire en plaçant le fichier dans un flux d'entrée? Pouvez-vous nous montrer votre code?)

Modifier:

Ok, que voulez-vous faire avec le contenu de l'article? Il y a une item.get()qui retourne tout le contenu d'un tableau d'octets.

Edit2

item.getSize() renverra le fichier téléchargé taille du fichier .

12
akarnokd

C'est un VRAI vieux fil, mais c'était toujours la première chose à apparaître lorsque j'ai cherché le numéro sur Google. Donc je voulais juste ajouter ceci:

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

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

33
W. B. Reed

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

32
Brian Agnew

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 ()

Si cela n'est pas possible, vous pouvez écrire les octets que vous avez lus dans le flux d'entrée sur un ByteArrayOutputStream qui augmentera selon les besoins.

16
Andrew Duffy

vous pouvez obtenir la taille de InputStream à l'aide de getBytes (inputStream) de Utils.Java

Obtenir les octets de Inputstream

4
Gnanam R

Pour InputStream

IoUtils.toByteArray(inputStream).length

Pour <fichier multipart> facultatif

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

Si vous savez que votre InputStream est une FileInputStream ou une ByteArrayInputStream, vous pouvez utiliser un peu de réflexion pour obtenir la taille du flux sans lire le contenu entier . Voici un exemple de méthode:

static long getInputLength(InputStream inputStream) {
    try {
        if (inputStream instanceof FilterInputStream) {
            FilterInputStream filtered = (FilterInputStream)inputStream;
            Field field = FilterInputStream.class.getDeclaredField("in");
            field.setAccessible(true);
            InputStream internal = (InputStream) field.get(filtered);
            return getInputLength(internal);
        } else if (inputStream instanceof ByteArrayInputStream) {
            ByteArrayInputStream wrapper = (ByteArrayInputStream)inputStream;
            Field field = ByteArrayInputStream.class.getDeclaredField("buf");
            field.setAccessible(true);
            byte[] buffer = (byte[])field.get(wrapper);
            return buffer.length;
        } else if (inputStream instanceof FileInputStream) {
            FileInputStream fileStream = (FileInputStream)inputStream;
            return fileStream.getChannel().size();
        }
    } catch (NoSuchFieldException | IllegalAccessException | IOException exception) {
        // Ignore all errors and just return -1.
    }
    return -1;
}

Cela pourrait être étendu pour supporter des flux d’entrée supplémentaires, j'en suis sûr.

0
Travis Parks

Lorsque vous traitez explicitement avec un ByteArrayInputStream, contrairement à certains commentaires de cette page, vous pouvez utiliser la fonction .available() pour obtenir la taille. Il suffit de le faire avant de commencer à le lire.

Depuis les JavaDocs:

Renvoie le nombre d'octets restants pouvant être lus (ou ignorés ) À partir de ce flux d'entrée. La valeur renvoyée est count - pos, qui est le nombre d'octets restant à lire dans le tampon d'entrée.

https://docs.Oracle.com/javase/7/docs/api/Java/io/ByteArrayInputStream.html#available ()

0