Façon élégante de lire le fichier dans le tableau byte[] en Java [dupliquer]

possibilité de dupliquer:

File to byte [] in Java

je veux lire les données du fichier et les démonter pour les envoyer. Dans la documentation il n'est pas clair, que FileInputStream a méthode pour lire tout son contenu. Pour ce faire, 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 semble laid, et ma question Est: Comment faire pour lire les données de fichier dans octet [] magnifiquement? :)

68
demandé sur Community 2011-05-19 15:35:26

6 réponses

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'empreinte de Bibliothèque est trop grande pour votre application Android, vous pouvez juste utiliser les classes pertinentes de la bibliothèque commons-io

aujourd'Hui (Java 7+ ou Android API de Niveau 26+)

Heureusement, nous avons maintenant un couple de commodité méthodes dans les paquets nio. Par exemple:

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

Javadoc ici

133
répondu Lukas Eder 2018-05-21 19:47:06

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();
        }
    }
}
59
répondu Paul 2013-05-04 20:19:39

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

35
répondu Peter Štibraný 2011-05-19 11:42:11

ça marche pour moi:

File file = ...;
byte[] data = new byte[(int) file.length()];
try {
    new FileInputStream(file).read(data);
} catch (Exception e) {
    e.printStackTrace();
}
17
répondu domsom 2012-07-19 20:23:22

utiliser un ByteArrayOutputStream . Voici le processus:

  • obtenir un InputStream pour lire les données
  • créer un ByteArrayOutputStream .
  • copier tous les InputStream dans le OutputStream
  • obtenez votre byte[] de la ByteArrayOutputStream en utilisant la toByteArray() méthode
13
répondu Vivien Barousse 2011-05-19 11:39:11

regardez la fonction apache commons suivante:

org.apache.commons.io.FileUtils.readFileToByteArray(File)
7
répondu BaSche 2015-07-27 17:05:37