簡體   English   中英

使用填充將文件讀入字節數組以實現8字節對齊-Java

[英]Reading a file into a byte-array with padding for 8-byte alignment - Java

我需要將文件讀入Java中的字節數組。 幸運的是, 這個問題已經很好地回答了,我能夠使用Java 7中的nio庫。

但是,這是一個變數:生成的字節數組的大小必須是8的倍數。額外的字節應為null,即\\ 0。

是否有一種快速且易讀的方法將字節數組填充為零,以便其大小為8的倍數? 請注意,這里的關鍵是可讀性和開發速度-如果最佳解決方案除了簡單地將文件讀入字節數組外還增加了幾行,我寧願將整個緩沖區復制到新數組中。

編輯:

更多的閱讀內容表明,我可以修改此答案 ,並將緩沖區的大小簡單地舍入到下一個8.對此策略的安全性和/或有效性有何想法​​? 我相信超出文件末尾的緩沖區中的字節將被初始化為零,並且不受讀取的影響-是正確的嗎?

由於8是2的冪,因此您可以快速獲取下一個數字:

int theSize = (orig + 7) & ~7;

對於直接讀入字節數組,您說您使用了nio; 因此,請從與文件關聯的通道中分配具有請求大小和.read()ByteBuffer (使用FileChannel.open() )。 然后使用ByteBuffer.array()方法獲取基礎數組。 (注意:請勿.allocateDirect() !否則.array()無效)

如果可以將FileChannel.map()設置為所需大小,那將是理想的選擇,不幸的是,將其映射為更大的大小會修改基礎文件,因此這里沒有骰子。


樣例代碼:

final Path path = Paths.get("path/to/wanted/file");

try (
    final FileChannel channel = FileChannel.open(path, StandardOpenOption.READ);
) {
    final int bufsize = ((int) channel.size() + 7) & ~7;
    final ByteBuffer buf = ByteBuffer.allocate(bufsize);
    channel.read(buf);
    return buf.array();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM