Question Convertir InputStream en tableau d'octets en Java


Comment puis-je lire un entier InputStream dans un tableau d'octets?


676
2017-08-12 07:27


origine


Réponses:


Vous pouvez utiliser Apache Commons IO pour gérer cette tâche et des tâches similaires.

le IOUtils type a une méthode statique pour lire un InputStream et renvoyer un byte[].

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

En interne, cela crée un ByteArrayOutputStream et copie les octets à la sortie, puis appelle toByteArray(). Il gère les gros fichiers en copiant les octets dans les blocs de 4KiB.


939
2017-08-12 07:35



Vous devez lire chaque octet de votre InputStream et l'écrire à un ByteArrayOutputStream. Vous pouvez ensuite récupérer le tableau d'octets sous-jacent en appelant toByteArray(); par exemple.

InputStream is = ...
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

while ((nRead = is.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

buffer.flush();

return buffer.toByteArray();

393
2017-08-12 07:30



Enfin, après vingt ans, il existe une solution simple sans avoir besoin d'une bibliothèque tierce, grâce à Java 9:

InputStream is;
…
byte[] array = is.readAllBytes();

Notez également les méthodes de commodité readNBytes(byte[] b, int off, int len) et transferTo(OutputStream) répondre aux besoins récurrents.


181
2018-06-07 13:50



Si vous utilisez google goyave, ce sera aussi simple que:

byte[] bytes = ByteStreams.toByteArray(inputStream);

107
2018-05-04 10:37



Utilisez Java de vanille DataInputStream et son readFully Méthode (existe depuis au moins Java 1.4):

...
byte[] imgDataBa = new byte[(int)imgFile.length()];
DataInputStream dataIs = new DataInputStream(new FileInputStream(imgFile));
dataIs.readFully(imgDataBa);
...

Il y a quelques autres saveurs de cette méthode, mais je l'utilise tout le temps pour ce cas d'utilisation.


98
2018-01-25 14:31



public static byte[] getBytesFromInputStream(InputStream is) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[0xFFFF];
    for (int len = is.read(buffer); len != -1; len = is.read(buffer)) { 
        os.write(buffer, 0, len);
    }
    return os.toByteArray();
}

32
2017-07-25 14:33



Avez-vous vraiment besoin de l'image en tant que byte[]? Qu'est-ce que vous attendez exactement dans le byte[] - le contenu complet d'un fichier image, codé dans un format quelconque dans lequel se trouve le fichier image, ou des valeurs de pixel RVB?

D'autres réponses ici vous montrent comment lire un fichier dans un byte[]. Votre byte[] contiendra le contenu exact du fichier, et vous devrez le décoder pour faire n'importe quoi avec les données d'image.

L'API standard de Java pour lire (et écrire) des images est l'API ImageIO, que vous pouvez trouver dans le paquet javax.imageio. Vous pouvez lire dans une image à partir d'un fichier avec une seule ligne de code:

BufferedImage image = ImageIO.read(new File("image.jpg"));

Cela vous donnera un BufferedImage, pas un byte[]. Pour obtenir les données d'image, vous pouvez appeler getRaster() sur le BufferedImage. Cela vous donnera un Raster objet, qui a des méthodes pour accéder aux données de pixel (il a plusieurs getPixel() / getPixels() méthodes).

Consulter la documentation de l'API pour javax.imageio.ImageIO, java.awt.image.BufferedImage, java.awt.image.Raster etc.

ImageIO prend en charge un certain nombre de formats d'image par défaut: JPEG, PNG, BMP, WBMP et GIF. Il est possible d'ajouter un support pour plus de formats (vous auriez besoin d'un plug-in qui implémente l'interface du fournisseur de service ImageIO).

Voir aussi le tutoriel suivant: Travailler avec des images


19
2017-08-12 08:14



Comme toujours, aussi Cadre de printemps (noyau de printemps depuis 3.2.2) a quelque chose pour vous: StreamUtils.copyToByteArray()


19
2018-04-18 13:59



Si vous ne souhaitez pas utiliser la bibliothèque Apache commons-io, cet extrait est extrait de la classe sun.misc.IOUtils. C'est presque deux fois plus rapide que l'implémentation courante utilisant ByteBuffers:

public static byte[] readFully(InputStream is, int length, boolean readAll)
        throws IOException {
    byte[] output = {};
    if (length == -1) length = Integer.MAX_VALUE;
    int pos = 0;
    while (pos < length) {
        int bytesToRead;
        if (pos >= output.length) { // Only expand when there's no room
            bytesToRead = Math.min(length - pos, output.length + 1024);
            if (output.length < pos + bytesToRead) {
                output = Arrays.copyOf(output, pos + bytesToRead);
            }
        } else {
            bytesToRead = output.length - pos;
        }
        int cc = is.read(output, pos, bytesToRead);
        if (cc < 0) {
            if (readAll && length != Integer.MAX_VALUE) {
                throw new EOFException("Detect premature EOF");
            } else {
                if (output.length != pos) {
                    output = Arrays.copyOf(output, pos);
                }
                break;
            }
        }
        pos += cc;
    }
    return output;
}

13
2017-09-17 14:04



ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (true) {
    int r = in.read(buffer);
    if (r == -1) break;
    out.write(buffer, 0, r);
}

byte[] ret = out.toByteArray();

9
2017-11-01 02:25



Au cas où quelqu'un est toujours à la recherche d'une solution sans dépendance &&  Si vous avez un fichier.

1) DataInputStream

 byte[] data = new byte[(int) file.length()];
 DataInputStream dis = new DataInputStream(new FileInputStream(file));
 dis.readFully(data);
 dis.close();

2) ByteArrayOutputStream

 InputStream is = new FileInputStream(file);
 ByteArrayOutputStream buffer = new ByteArrayOutputStream();
 int nRead;
 byte[] data = new byte[(int) file.length()];
 while ((nRead = is.read(data, 0, data.length)) != -1) {
     buffer.write(data, 0, nRead);
 }

3) RandomAccessFile

 RandomAccessFile raf = new RandomAccessFile(file, "r");
 byte[] data = new byte[(int) raf.length()];
 raf.readFully(data);

7
2018-04-21 17:09