Come si può scrivere una matrice di byte in un file (e leggere nuovamente dal file) in Java?
Sì, sappiamo tutti che ci sono già un sacco di domande come questa, ma sono molto disordinato e soggettivo dovuto al fatto che ci sono tanti modi per eseguire questa operazione.
Quindi cerchiamo di ridurre la portata della questione:
Dominio:
- Android / Java
Quello che vogliamo:
- Veloce (per quanto possibile)
- Bug-free (in rigidamente meticolosamente)
Cosa non si fa:
- Librerie di terze parti
- Tutte le librerie che richiedono API di Android oltre 23 (Marshmallow)
(Così, che esclude Apache Commons, Google Guava, Java.nio, e ci lascia con un buon ol' Java.io)
Ciò di cui abbiamo bisogno:
- Matrice di Byte è sempre esattamente lo stesso (contenuto e dimensioni), dopo il passaggio attraverso la scrittura-poi-processo di lettura
- Metodo di scrittura richiede solo due argomenti: il File e dati byte[]
- Metodo di lettura restituisce un byte[] e richiede un solo argomento: il File
Nel mio caso particolare, questi metodi sono privati (non una libreria) e NON e ' responsabile per i seguenti, (ma se si desidera creare una soluzione universale che si applica a un pubblico più ampio, andare per esso):
- Thread-safety (file non saranno accessibili da più di un processo alla volta)
- File null
- File indicando inesistente posizione
- Mancanza di autorizzazioni alla posizione del file
- Matrice di Byte di essere troppo grande
- Matrice di Byte null
- Trattare con "indice" di "lunghezza" o "aggiungi" argomenti/capacità
Quindi... siamo una sorta di ricerca della definitiva a prova di proiettile codice che la gente in futuro può assumere è sicuro da usare, perché la tua risposta ha un sacco di voti e non ci sono commenti che dicono, "Che potrebbe bloccarsi se..."
Questo è ciò che ho finora:
Scrivere I Byte Del File:
private void writeBytesToFile(final File file, final byte[] data) {
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
}
Leggere I Byte Dal File:
private byte[] readBytesFromFile(final File file) {
RandomAccessFile raf;
byte[] bytesToReturn = new byte[(int) file.length()];
try {
raf = new RandomAccessFile(file, "r");
raf.readFully(bytesToReturn);
} catch (Exception e) {
Log.i("XXX", "BUG: " + e);
}
return bytesToReturn;
}
Da quello che ho letto, le possibili Eccezioni sono:
FileNotFoundException : ho capito bene che questo non dovrebbe accadere in quanto lungo il percorso del file forniti è stato ricavato utilizzando Android strumenti interni e/o se l'applicazione è stato testato correttamente?
IOException : io non so davvero che cosa potrebbe causare questo... ma io parto dal presupposto che non c'è modo intorno ad esso, se lo fa.
Quindi, con questo in mente... questi metodi possono essere migliorati o sostituiti, e se sì, con cosa?