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.
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é .
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.
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)
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.
Vous pouvez obtenir la taille de InputStream en utilisant getBytes (inputStream) D'Utils.java vérifier ce lien suivant
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()
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.
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: ";
}