Déterminer la taille d'un InputStream
Ma situation actuelle: je dois lire un fichier et mettre le contenu dans InputStream
. Par la suite j'ai besoin de placer le contenu de la InputStream
dans un tableau d'octets qui nécessite (autant que je sache) de la taille de la InputStream
. Des idées?
Comme demandé, je vais vous montrer le flux d'entrée que je suis entrain de créer à 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 une HttpServletRequest
objet, qui est comme le FileItemFactory
et ServletFileUpload
est de l'Apache Commons FileUpload paquet.
Vous devez vous connecter pour publier un commentaire.
Je voulais juste ajouter, Apache Commons IO a en charge des flux utilitaires pour effectuer la copie. (Btw, que voulez-vous dire en plaçant le fichier dans un inputstream? Pouvez-vous nous montrer ton code?)
Edit:
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()
sera de retour le téléchargement de la la taille du fichier.C'est VRAIMENT un vieux thread, mais c'était toujours la première chose à pop-up quand j'ai googlé la question. Donc, je voulais juste ajouter ceci:
A fonctionné pour moi. Et BEAUCOUP plus simple que les autres réponses ici.
available()
de "méthode de Noter que, tandis que certaines implémentations de InputStream sera de retour le nombre total d'octets dans le flux, beaucoup ne le seront pas. Il n'est jamais correct d'utiliser la valeur de retour de cette méthode pour allouer un tampon destiné à conserver toutes les données de ce flux."Je lis dans un ByteArrayOutputStream et ensuite appeler toByteArray() pour obtenir la résultante tableau d'octets. Vous n'avez pas besoin de définir la taille à l'avance (même si c'est peut-être une optimisation si vous savez qu'il. Dans de nombreux cas, vous n'aurez pas)
Vous ne pouvez pas déterminer la quantité de données dans un flux sans le lire; vous pouvez, cependant, de demander la taille d'un fichier:
http://java.sun.com/javase/6/docs/api/java/io/File.html#length()
Si ce n'est pas possible, vous pouvez écrire les octets lus à partir du flux d'entrée pour un ByteArrayOutputStream qui va grandir en tant que de besoin.
vous pouvez obtenir la taille de InputStream à l'aide de getBytes(inputStream) de Utils.java vérifier le lien suivant
Obtenir des Octets de Inputstream
Pour InputStream
Pour Option < MultipartFile >
Quand explicitement traiter avec un
ByteArrayInputStream
puis contrairement à certains commentaires sur cette page, vous pouvez utiliser le.available()
fonction pour obtenir la taille. Suffit de le faire avant de commencer la lecture à partir d'elle.De la Javadoc:
https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available()
Si vous savez que votre
InputStream
est unFileInputStream
ou unByteArrayInputStream
, vous pouvez utiliser un peu de réflexion pour obtenir le flux de la taille sans lire tout le contenu. Voici un exemple de méthode:Cela pourrait être étendu pour prendre en charge d'autres flux d'entrée, j'en suis sûr.
Utiliser cette méthode, vous avez juste à passer le InputStream
InputStream
est toujours une Chaîne de caractères (pas nécessaire car il peut être binaire de données), et en tout cas il n'a pas de retour de la taille du cours d'eau qui est ce que la question posée. En outre, il ajoute des octets (\n
) pour les donnéessb.length()
sera également inexacte.String
flux.\n
est vraiment nécessaire, parce que vous avez à donner un format aux commentaires reçus, je ne veux pas de chorizo longString
, de sorte que même ceux\n
compte.int disponible ()
Renvoie une estimation du nombre d'octets qui peut être lu (ou ignorée) à partir de ce flux d'entrée sans blocage par la prochaine invocation d'une méthode de ce flux d'entrée. La prochaine invocation peut-être le même thread ou un autre thread. Une seule lecture ou de sauter de ce nombre d'octets ne va pas bloquer, mais peut lire ou passer moins d'octets.
InputStream - SDK Android | Développeurs Android