Cum putem scrie un octet matrice într-un fișier (și citește din fișierul respectiv) în Java?
Da, știm cu toții, există deja o mulțime de întrebări de genul ăsta, dar ei a lua foarte murdar și subiective, datorită faptului că există atât de multe moduri de a realiza această sarcină.
Așa că hai să reducă domeniul de aplicare de întrebarea:
Domeniu:
- Android / Java
Ceea ce ne dorim:
- Repede (posibil)
- Bug-free (într-un mod rigid modul meticulos)
Ce nu facem:
- Biblioteci terțe părți
- Orice biblioteci care necesită API Android mai târziu de 23 (Marshmallow)
(Deci, care exclude Apache Commons, Google Guava, Java.nio, și ne lasă cu bun ol' Java.io)
De ce avem nevoie:
- Matrice octet este întotdeauna exact la fel (conținutul și mărimea) după parcurgerea scrie-apoi-a citit procesul
- Scrie metodă necesită doar două argumente: File, și byte[] date
- Citește metoda returnează un byte[] și necesită doar un singur argument: File
In cazul meu particular, aceste metode sunt private (nu o bibliotecă) și sunt responsabili pentru următoarele, (dar dacă doriți pentru a crea o soluție universală, care se aplică la un public mai larg, du-te pentru ea):
- Fir de siguranță-(fișierul nu va fi accesate de mai mult de un proces, la o dată)
- Dosar fiind nul
- Fișier arătând spre inexistente locație
- Lipsa de permisiuni la locația fișierului
- Matrice octet fiind prea mare
- Matrice octet fiind nul
- De-a face cu orice "index", "lungime" sau "adăugare" argumente/capacități
Deci... suntem un fel de în căutare de definitive bullet-dovada de cod pe care oamenii, în viitor, se poate presupune că este sigur de utilizat, deoarece răspunsul tău are o mulțime de voturi și nu există comentarii care spun, "Care s-ar putea prăbuși dacă..."
Aceasta este ceea ce am pana acum:
Scrie Octeți Într-Un Fișier:
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);
}
}
Citește Octeți Din Fișier:
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;
}
Din ce am citit, posibilele Excepții sunt:
FileNotFoundException : Sunt corect ca acest lucru să nu se întâmple atâta timp cât calea de fișier de a fi livrate a fost derivat cu ajutorul Android propriile instrumente interne și/sau în cazul în care aplicația a fost testat în mod corespunzător?
IOException : chiar nu stiu ce ar putea cauza asta... dar presupun că nu există nici o cale în jurul valorii de ea dacă o face.
Deci, cu asta în minte... aceste metode pot fi îmbunătățite sau înlocuite, și dacă da, cu ce?