Jak můžeme napsat bajtové pole do souboru (a přečtěte si ji zpět z tohoto souboru) v Javě?
Ano, všichni víme, že již existuje spousta otázek, jako to, ale oni si velmi chaotický a subjektivní vzhledem k tomu, že tam jsou tak mnoho způsobů, jak provést tento úkol.
Takže pojďme snížit rozsah otázku:
Domény:
- Android / Java
Co chceme:
- Rychle (jak je to možné)
- Bug-free (v pevně pečlivý způsob, jak)
Co dělat nebudeme:
- Knihoven třetích stran
- Knihovny, které vyžadují Android API později než 23 (Marshmallow)
(Takže to vylučuje Apache Commons, Google Guava, Java.nio, a ponechává nás dobrý ol' Java.io)
Co potřebujeme:
- Bajt pole je vždy úplně stejný (obsah a velikost) poté, co prochází psát-pak-proces čtení
- Napište metoda vyžaduje pouze dva argumenty: Soubor soubor a byte[] data
- Čtení metoda vrátí byte[] a vyžaduje pouze jeden argument: File
V mém konkrétním případě, jsou tyto metody vlastní (ne knihovnu) a NENÍ odpovědný za následující, (ale pokud chcete vytvořit více univerzální řešení, které se vztahuje na širší publikum, jít na to):
- Thread-bezpečnost (soubor nebude mít přístup více než jeden proces najednou)
- Soubor je null
- Soubor, který odkazuje na neexistující místo
- Nedostatek oprávnění na umístění souboru
- Bajt pole je příliš velké
- Byte array je null
- Jednání s "index," "délku", nebo "připojit" argumenty/schopnosti
Takže jsme tak nějak v hledání konečného bullet-proof kód, který lidé v budoucnosti lze předpokládat, že je bezpečné použít, protože vaše odpověď má spoustu up-hlasů, a nejsou tam žádné komentáře, které říkají, "To může selhat, pokud..."
To je to, co zatím mám:
Zápis Bytů Do Souboru:
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);
}
}
Čtení Bajtů Ze Souboru:
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;
}
Z toho, co jsem četl, možné Výjimky jsou:
FileNotFoundException : mám pravdu, že tohle by se nemělo stát, jak dlouho cesta k souboru dodáváno byl odvozen pomocí Android je vlastní interní nástroje, a/nebo pokud aplikace byla testována správně?
IOException : já opravdu nevím, co by to mohlo způsobit... ale já jsem za předpokladu, že neexistuje žádný způsob, jak kolem toho, když to dělá.
Takže s tím na mysli... mohou tyto metody být zlepšeny nebo nahrazeny, a pokud ano, s čím?