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 []? :)
Appelez l'un de ces
byte[] org.Apache.commons.io.FileUtils.readFileToByteArray(File file)
byte[] org.Apache.commons.io.IOUtils.toByteArray(InputStream input)
De
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
Heureusement, nous avons maintenant quelques méthodes pratiques dans les paquets nio. Par exemple:
byte[] Java.nio.file.Files.readAllBytes(Path path)
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();
}
}
}
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)
Cela fonctionne pour moi:
File file = ...;
byte[] data = new byte[(int) file.length()];
try {
new FileInputStream(file).read(data);
} catch (Exception e) {
e.printStackTrace();
}
Utilisez un ByteArrayOutputStream
. Voici le processus:
InputStream
pour lire les donnéesByteArrayOutputStream
.InputStream
dans le OutputStream
byte[]
Du ByteArrayOutputStream
en utilisant la méthode toByteArray()
Jetez un coup d’œil à la fonction Apache commons suivante:
org.Apache.commons.io.FileUtils.readFileToByteArray(File)