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.
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 .
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.
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)
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.
vous pouvez obtenir la taille de InputStream à l'aide de getBytes (inputStream) de Utils.Java
Pour InputStream
IoUtils.toByteArray(inputStream).length
Pour <fichier multipart> facultatif
Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
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.
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 ()