Modo elegante per leggere il file in byte arrays in Java

Possibile duplicazione:
File in byte [] in Java

Voglio leggere i dati dal file e spararmelo a Parcel. Nella documentazione non è chiaro che FileInputStream abbia un metodo per leggere tutto il suo contenuto. Per attuare questo, faccio il seguente:

  • Come impostare proxy a livello di sistema in ICS
  • Come mantenere la session di login utente?
  • Implementazione di AsyncQueryHandler
  • Perché "System.out.println" non funziona in Android?
  • Importzione di android.support non può essere risolto
  • Qual è il modo migliore per memorizzare l'image nella memory dell'app?
  • 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 arrays chunks.clear(); // finally I can unmarshall this data to Parcel Parcel parcel = Parcel.obtain(); parcel.unmarshall(rawdata,0,rawdata.length); 

    Penso che questo codice sembri brutto, e la mia domanda è: come fare i dati di lettura da file in byte [] splendidamente? 🙂

  • Firebase Android: Si è verificato un errore interno.
  • Come convertire l'image in byte arrays in Android
  • Ottenere l'orientamento del dispositivo Android
  • Visualizzare un RecyclerView nel frammento
  • KSOAP non ha mai timeout
  • Il pollice personalizzato non è trasparente su Lollipop API21
  • 6 Solutions collect form web for “Modo elegante per leggere il file in byte arrays in Java”

    Tanto tempo fa:

    Chiamate una di queste

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

    A partire dal

    http://commons.apache.org/io/

    Se l'impronta della biblioteca è troppo grande per l'applicazione Android, puoi utilizzare classi pertinenti dalla libreria di comuni

    Oggi (Java 7+, se non usi Android)

    Fortunatamente, abbiamo già un paio di methods di convenienza nei pacchetti nio. Per esempio:

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

    Javadoc qui

    Questo functionrà anche:

     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(); } } } 

    Se utilizzi Google Guava (e se non lo devi), puoi call: ByteStreams.toByteArray(InputStream) o Files.toByteArray(File)

    Questo funziona per me:

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

    Utilizza un ByteArrayOutputStream . Ecco il process:

    • Ottieni un InputStream per leggere i dati
    • Creare un ByteArrayOutputStream .
    • Copiare tutto il InputStream nel OutputStream
    • Ottieni il byte[] dal toByteArray() utilizzando il metodo toByteArray()

    Date un'occhiata alla seguente funzionalità apache commons:

     org.apache.commons.io.FileUtils.readFileToByteArray(File) 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.