該賞金過期7天。此問題的答案有資格獲得 300聲望獎勵。 Nerdy Bunz正在尋找規范的答案:
呵呵!!扔掉你的帽子!
我們如何在 Java 中將位元組陣列寫入檔案(并從該檔案讀回)?
是的,我們都知道已經有很多這樣的問題,但是由于有很多方法可以完成這項任務,因此它們變得非常混亂和主觀。
所以讓我們縮小問題的范圍:
領域:
- 安卓/Java
我們想要的是:
- 快(盡可能)
- 無錯誤(以嚴格細致的方式)
我們沒有做什么:
- 第三方庫
- 任何需要 Android API 晚于 23 (Marshmallow) 的庫
(因此,就我所知,這排除了 Apache Commons、Google Guava、Java.nio,并為我們留下了很好的 Java.io。)
我們需要的:
- 位元組陣列經過寫入再讀取程序后始終完全相同(內容和大小)
- 寫方法只需要兩個引數:檔案檔案和位元組[]資料
- Read 方法回傳一個位元組 [] 并且只需要一個引數:檔案檔案
讀或寫方法都不負責:
- 執行緒安全(檔案不會被多個行程同時訪問)
- 檔案為空
- 檔案指向不存在的位置
- 檔案位置缺少權限
寫方法不負責:
- 位元組陣列太大
- 位元組陣列為空
- 處理任何“索引”、“長度”或“附加”引數/功能
所以......我們正在尋找未來人們可以認為可以安全使用的最終防彈代碼,因為你的答案有很多贊成票并且沒有評論說,“這可能會崩潰如果...”
這是我到目前為止:
將位元組寫入檔案:
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);
}
}
從檔案中讀取位元組:
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;
}
根據我的閱讀,可能的例外是:
FileNotFoundException :只要提供的檔案路徑是使用 Android 自己的內部工具派生的和/或應用程式是否經過正確測驗,就不會發生這種情況是否正確?
IOException :我真的不知道是什么導致了這種情況......但我假設如果確實如此,那就沒有辦法了。
所以考慮到這一點......這些方法可以改進或替換嗎,如果可以,用什么?
uj5u.com熱心網友回復:
最簡單的,使用java的Files.readAllBytes
從檔案中讀取所有位元組。該方法確保在讀取所有位元組或拋出 I/O 錯誤或其他運行時例外時關閉檔案。請注意,此方法適用于可以方便地將所有位元組讀入位元組陣列的簡單情況。它不適用于讀取大檔案。
檔案寫入
將位元組寫入檔案。options 引數指定檔案的創建或打開方式。如果不存在任何選項,則此方法就像存在 CREATE、TRUNCATE_EXISTING 和 WRITE 選項一樣作業。換句話說,它打開檔案進行寫入,如果檔案不存在則創建檔案,或者最初將現有的常規檔案截斷到大小為 0。位元組陣列中的所有位元組都寫入檔案。該方法確保在寫入所有位元組(或拋出 I/O 錯誤或其他運行時例外)時關閉檔案。如果發生 I/O 錯誤,則它可能會在檔案創建或截斷之后,或者在將某些位元組寫入檔案之后發生。用法示例:默認情況下,該方法會創建一個新檔案或覆寫現有檔案。假設您想將位元組附加到現有檔案中:
Path path = ... byte[] bytes = ... Files.write(path, bytes, StandardOpenOption.APPEND);
uj5u.com熱心網友回復:
我建議使用具有適當緩沖區大小的aBufferedInputStream和 a BufferedOutputStream。
寫入檔案
public static void write(final File file, final byte[] bytes) {
try (final BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file), 64 * 1024)) {
bos.write(bytes);
} catch (final Exception ex) {
Log.w("XXX", "Cannot write to file: " ex);
}
}
從檔案中讀取
public static byte[] read(final File file) {
byte[] bytes = new byte[(int) file.length()]; // can only read up to 2GB
try (final BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file), 64 * 1024)) {
bis.read(bytes);
} catch (final Exception ex) {
Log.w("XXX", "Cannot read from file: " ex);
}
return bytes;
}
緩沖區大小對性能很重要。我使用了 64K 緩沖區,但您可以隨意使用它并選擇適合您需要的緩沖區大小。但它應該至少為 8K,最好是檔案系統塊大小的倍數。
在捕獲 general 時也要小心Exception,因為它也可以捕獲例外,這些例外可能表明只是寫入/讀取檔案的更大問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365667.html
上一篇:檢查appdata中是否存在檔案而不在python代碼中添加完整路徑
下一篇:Python-基于部分字串列印行
