Double Possible:
Fichier byte[] en JavaJe veux lire des données à partir d'un fichier et unmarshal à la Parcelle. Dans la documentation, il n'est pas clair, que FileInputStream a la méthode pour lire l'intégralité de son contenu. Pour mettre en œuvre cette, je n'ai suivantes:
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 est moche, et ma question est: Comment faire lire les données à partir d'un fichier en byte[] magnifiquement? :)
Cette question a déjà des réponses:
- Fichier à modifier (5 réponses )
Réponses
Trop de publicités?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 application Android, vous pouvez simplement utiliser les classes pertinentes de la bibliothèque commons-io.
Paul
Points
331
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();
}
}
}
Peter Štibraný
Points
17507
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)
domsom
Points
1968
Vivien Barousse
Points
11435
Utiliser un ByteArrayOutputStream
. Voici le processus:
- Obtenir un
InputStream
pour lire les données - Créer un
ByteArrayOutputStream
. - Copiez tous les
InputStream
dans laOutputStream
- Obtenez votre
byte[]
de laByteArrayOutputStream
à l'aide de l'toByteArray()
méthode