Déterminer la taille d'un InputStream

Ma situation actuelle: je dois lire un fichier et mettre le contenu dans InputStream. Ensuite, je dois placer le contenu du InputStream dans un tableau d'octets qui nécessite (pour autant que je sache) la taille du 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 comme le FileItemFactory et ServletFileUpload provient du paquet Apache Commons FileUpload.

46
demandé sur Serhiy 2009-07-13 17:05:33

8 réponses

Je voulais juste ajouter, Apache Commons IO a des utilitaires de support de flux pour effectuer la copie. (Btw, que voulez-vous dire en plaçant le fichier dans un inputstream? Pouvez-vous nous montrer ton code?)

Modifier:

Bon, que voulez-vous faire avec le contenu de l'article? Il y a un item.get() qui renvoie la chose entière dans un tableau d'octets.

Edit2

item.getSize() retourne la taille du fichier Téléchargé .

11
répondu akarnokd 2009-07-13 13:37:32

C'est un très vieux fil, mais c'était toujours la première chose à apparaître quand j'ai googlé le problème. 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
répondu W. B. Reed 2013-08-14 16:30:07

Je lirais dans un ByteArrayOutputStream puis appellerais 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 peut-être une optimisation Si vous le connaissez. Dans de nombreux cas, vous ne le ferez pas)

28
répondu Brian Agnew 2015-06-01 22:02:38

Vous ne pouvez pas déterminer la quantité de données dans un flux sans la 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 lisez à partir du flux d'entrée dans un ByteArrayOutputStream qui grandira au besoin.

16
répondu Andrew Duffy 2009-07-13 13:09:11

Vous pouvez obtenir la taille de InputStream en utilisant getBytes (inputStream) D'Utils.java vérifier ce lien suivant

Récupère les octets de Inputstream

3
répondu Gnanam R 2013-03-21 12:11:56

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

À partir des JavaDocs:

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

Https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available()

0
répondu Sverrir Sigmundarson 2017-09-22 10:05:25
    try {
        InputStream connInputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    int size = connInputStream.available();

Int disponible () Renvoie une estimation du nombre d'octets qui peuvent être lus (ou ignorés) à partir de ce flux d'entrée sans blocage par l'appel suivant d'une méthode pour ce flux d'entrée. L'appel suivant peut être le même thread ou un autre thread. Une seule lecture ou un saut de ce nombre d'octets ne bloquera pas, mais peut lire ou ignorer moins d'octets.

InputStream-Android SDK / Développeurs Android

0
répondu Ashnet 2017-12-05 16:02:58

Utilisez cette méthode, il vous suffit de passer le InputStream

public String readIt(InputStream is) {
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);

        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        is.close();
        return sb.toString();
    }
    return "error: ";
}
-1
répondu Carlos.V 2017-03-01 10:00:28