50 votes

Lecture d'un fichier binaire dans un tableau à un octet dans JAVA

De la documentation, il est dit que l'on ne devrait pas utiliser available() méthode pour déterminer la taille d'un InputStream de la taille. Alors comment puis-je atteindre les objectifs suivants, à savoir la lecture de l'ensemble du contenu de ce InputStream objet dans un tableau d'octets?

InputStream in; //assuming already present
byte[] data = new byte[in.available()];
in.read(data);//now data is filled with the whole content of the InputStream object

J'ai pu lire plusieurs fois avec une taille de mémoire tampon. Mais alors je vais avoir un problème de combiner ces tableaux d'octets.

S'il vous plaît aider. Merci beaucoup.

64voto

Jon Skeet Points 692016

L'approche la plus simple de l'OMI est l'utilisation de Goyave et de ses ByteStreams classe:

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

Ou pour un fichier:

byte[] bytes = Files.toByteArray(file);

Sinon (si vous ne voulez pas utiliser de Goyave), vous pouvez créer un ByteArrayOutputStream, et à plusieurs reprises de lire dans un tableau d'octets et d'écrire dans la ByteArrayOutputStream (laissant que la poignée de redimensionnement), puis appelez ByteArrayOutputStream.toByteArray().

Notez que cette approche fonctionne, que vous pouvez dire à la longueur de votre entrée ou de pas - en supposant que vous avez assez de mémoire, bien sûr.

62voto

GregS Points 16158

Si vous lisez à partir d'un fichier, vous pouvez faire quelque chose comme ceci:

    File file = new File("myFile");
    byte[] fileData = new byte[(int) file.length()];
    DataInputStream dis = new DataInputStream(new FileInputStream(file));
    dis.readFully(fileData);
    dis.close();

Mise à JOUR (31 Mai 2014):

Java 7 ajoute quelques nouvelles fonctionnalités en java.nio.fichier de package qui peut être utilisé pour faire de cet exemple, quelques lignes plus courtes. Voir la readAllBytes() la méthode en java.nio.fichier.Les fichiers de classe. Voici un court exemple:

import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;

// ...
        Path p = FileSystems.getDefault().getPath("", "myFile");
        byte [] fileData = Files.readAllBytes(p);

Notez que, au moment d'écrire ces lignes, l'API Android ne prend pas en charge cette (ou quoi que ce soit en Java 7).

9voto

Andrey Points 2962

Vous pouvez utiliser Apache commons-io pour cette tâche:

Reportez-vous à cette méthode:

public static byte[] readFileToByteArray(File file) throws IOException

Mise à jour:

Java 7 chemin:

byte[] bytes = Files.readAllBytes(Paths.get(filename));

et si c'est un fichier texte et que vous souhaitez les convertir en String (modification de l'encodage que nécessaire):

StandardCharsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString()

6voto

SJuan76 Points 16867

Vous pouvez le lire par morceaux ( byte buffer[] = new byte[2048] ) et écrire les morceaux dans un ByteArrayOutputStream. À partir de ByteArrayOutputStream, vous pouvez récupérer le contenu sous forme d'octet [], sans avoir besoin de déterminer sa taille au préalable.

5voto

Jam Points 13872

Je crois que la longueur du tampon doit être spécifiée, car la mémoire est finie et vous risquez d'en manquer

Exemple:

 InputStream in = new FileInputStream(strFileName);
    long length = fileFileName.length();

    if (length > Integer.MAX_VALUE) {
        throw new IOException("File is too large!");
    }

    byte[] bytes = new byte[(int) length];

    int offset = 0;
    int numRead = 0;

    while (offset < bytes.length && (numRead = in.read(bytes, offset, bytes.length - offset)) >= 0) {
        offset += numRead;
    }

    if (offset < bytes.length) {
        throw new IOException("Could not completely read file " + fileFileName.getName());
    }

    in.close();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X