web-dev-qa-db-fra.com

Manière élégante de lire le fichier dans le tableau d'octets [] dans Java

Duplicate possible:
Fichier en octet [] en Java

Je veux lire les données d'un fichier et les disséminer dans Parcel. Dans la documentation, il n’est pas clair que FileInputStream dispose d’une méthode pour lire tout son contenu. Pour implémenter ceci, je fais ce qui suit:

FileInputStream filein = context.openFileInput(FILENAME);


int read = 0;
int offset = 0;
int chunk_size = 1024;
int total_size = 0;

ArrayList<byte[]> chunks = new ArrayList<byte[]>();
chunks.add(new byte[chunk_size]);
//first I read data from file chunk by chunk
while ( (read = filein.read(chunks.get(chunks.size()-1), offset, buffer_size)) != -1) {
    total_size+=read;
    if (read == buffer_size) {
         chunks.add(new byte[buffer_size]);
    }
}
int index = 0;

// then I create big buffer        
byte[] rawdata = new byte[total_size];

// then I copy data from every chunk in this buffer
for (byte [] chunk: chunks) {
    for (byte bt : chunk) {
         index += 0;
         rawdata[index] = bt;
         if (index >= total_size) break;
    }
    if (index>= total_size) break;
}

// and clear chunks array
chunks.clear();

// finally I can unmarshall this data to Parcel
Parcel parcel = Parcel.obtain();
parcel.unmarshall(rawdata,0,rawdata.length);

Je pense que ce code a l'air moche, et ma question est la suivante: comment lire magnifiquement les données d'un fichier dans un octet []? :)

70
Arseniy

Il y a longtemps:

Appelez l'un de ces

byte[] org.Apache.commons.io.FileUtils.readFileToByteArray(File file)
byte[] org.Apache.commons.io.IOUtils.toByteArray(InputStream input) 

De

http://commons.Apache.org/io/

Si l'encombrement de la bibliothèque est trop important pour votre Android, vous pouvez simplement utiliser les classes pertinentes de la bibliothèque commons-io

Aujourd'hui (Java 7+ ou Android API de niveau 26+)

Heureusement, nous avons maintenant quelques méthodes pratiques dans les paquets nio. Par exemple:

byte[] Java.nio.file.Files.readAllBytes(Path path)

Javadoc ici

136
Lukas Eder

Cela fonctionnera également:

import Java.io.*;

public class IOUtil {

    public static byte[] readFile(String file) throws IOException {
        return readFile(new File(file));
    }

    public static byte[] readFile(File file) throws IOException {
        // Open file
        RandomAccessFile f = new RandomAccessFile(file, "r");
        try {
            // Get and check length
            long longlength = f.length();
            int length = (int) longlength;
            if (length != longlength)
                throw new IOException("File size >= 2 GB");
            // Read file and return data
            byte[] data = new byte[length];
            f.readFully(data);
            return data;
        } finally {
            f.close();
        }
    }
}
62
Paul

Si vous utilisez Google Guava (et si vous ne le faites pas, vous devriez le faire), vous pouvez appeler: ByteStreams.toByteArray(InputStream) ou Files.toByteArray(File)

37
Peter Štibraný

Cela fonctionne pour moi:

File file = ...;
byte[] data = new byte[(int) file.length()];
try {
    new FileInputStream(file).read(data);
} catch (Exception e) {
    e.printStackTrace();
}
17
domsom

Utilisez un ByteArrayOutputStream . Voici le processus:

  • Obtenez un InputStream pour lire les données
  • Créez un ByteArrayOutputStream.
  • Copier tous les InputStream dans le OutputStream
  • Obtenez votre byte[] Du ByteArrayOutputStream en utilisant la méthode toByteArray()
13
Vivien Barousse

Jetez un coup d’œil à la fonction Apache commons suivante:

org.Apache.commons.io.FileUtils.readFileToByteArray(File)
7
BaSche