Java'da bir dosyaya bir bayt dizisi nasıl yazabiliriz (ve bu dosyadan geri okuyabiliriz)?
Evet, hepimiz zaten bunun gibi birçok soru olduğunu biliyoruz, ancak bu görevi yerine getirmenin pek çok yolu olduğu için çok dağınık ve öznel hale geliyorlar.
Öyleyse sorunun kapsamını azaltalım:
Alan:
- Android / Java
Ne istiyoruz:
- (Mümkün olduğu kadar)hızlı
- Hatasız (son derece titiz bir şekilde)
Yapmadığımız şey:
- Üçüncü taraf kitaplıkları
- 23'ten sonra Android API gerektiren kütüphaneler (Marshmallow)
(Yani, bu Apache Commons, Google Guava, Java'yı dışlar.nio, ve bizi eski güzellikle baş başa bırakıyor. Java.io)
İhtiyacımız olan şey:
- Bayt dizisi, yazma ve okuma işleminden geçtikten sonra her zaman tam olarak aynıdır (içerik ve boyut)
- Yazma yöntemi yalnızca iki bağımsız değişken gerektirir: File file ve byte[] data
- Read yöntemi bir byte [] döndürür ve yalnızca bir bağımsız değişken gerektirir: File file
Benim özel durumumda, bu yöntemler özeldir (kütüphane değildir) ve aşağıdakilerden sorumlu değildir (ancak daha geniş bir kitleye uygulanan daha evrensel bir çözüm oluşturmak istiyorsanız, bunun için gidin):
- İş parçacığı güvenliği (dosyaya aynı anda birden fazla işlem tarafından erişilemez)
- Dosya boş
- Varolmayan konuma işaret eden dosya
- Dosya konumunda izin eksikliği
- Bayt dizisi çok büyük
- Bayt dizisi null
- Herhangi bir" dizin"," uzunluk "veya" ekleme " argümanları / yetenekleri ile uğraşmak
Böyle... gelecekte insanların kullanımının güvenli olduğunu varsayabilecekleri kesin kurşun geçirmez kodu arıyoruz çünkü cevabınız çok fazla oy alıyor ve "Bu çökebilir" diyen hiçbir yorum yok..."
Şimdiye kadar sahip olduğum şey bu:
Dosyaya Bayt Yaz:
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);
}
}
Dosyadan Bayt Okuma:
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;
}
Okuduklarımdan, olası İstisnalar şunlardır:
FileNotFoundException: Sağlanan dosya yolu Android'in kendi dahili araçları kullanılarak türetildiği ve/veya uygulama düzgün bir şekilde test edildiği sürece bunun olmaması gerektiği konusunda doğru muyum?
IOException: Buna neyin sebep olabileceğini gerçekten bilmiyorum... ama öyle olursa bunun üstesinden gelmenin bir yolu olmadığını varsayıyorum.
Bunu akılda tutarak... bu yöntemler geliştirilebilir veya değiştirilebilir mi ve eğer öyleyse, ne ile?