[英]Write and read multiple byte[] in file with Java
我必須在文件中寫字節數組。 我不能一次做到這一點所以我不能把我的數組放在一個容器中。 我的數組的大小也是可變的。 其次,文件非常龐大,所以我必須拆分它,以便按數組讀取它。
我怎樣才能做到這一點 ? 我試圖逐行寫我的字節數組,但我還沒能。 如何在我的數組之間放置一個分隔符並將其拆分為此分隔符?
編輯:
我試過這個:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(byteArray);
但是,我多次執行此代碼,因此ObjectOutputStream每次添加一個損壞文件的新標頭。
我也嘗試:
out.write(byteArray);
但我無法分離我的陣列。 所以我試圖附加一個'\\ n',但沒有用。 我在尋找像FileUtils這樣的庫,以便逐行寫byte [],但我沒有找到。
您可以使用現有的集合,例如List來維護byte []的List並將其傳輸
List<byte[]> list = new ArrayList<byte[]>();
list.add("HI".getBytes());
list.add("BYE".getBytes());
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
"test.txt"));
out.writeObject(list);
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
"test.txt"));
List<byte[]> byteList = (List<byte[]>) in.readObject();
//if you want to add to list you will need to add to byteList and write it again
for (byte[] bytes : byteList) {
System.out.println(new String(bytes));
}
輸出:
HI
BYE
另一種選擇是使用RandomAccessFile 。 這不會強迫您閱讀完整文件,您可以跳過您不想閱讀的數據。
DataOutputStream dataOutStream = new DataOutputStream(
new FileOutputStream("test1"));
int numberOfChunks = 2;
dataOutStream.writeInt(numberOfChunks);// Write number of chunks first
byte[] firstChunk = "HI".getBytes();
dataOutStream.writeInt(firstChunk.length);//Write length of array a small custom protocol
dataOutStream.write(firstChunk);//Write byte array
byte[] secondChunk = "BYE".getBytes();
dataOutStream.writeInt(secondChunk.length);//Write length of array
dataOutStream.write(secondChunk);//Write byte array
RandomAccessFile randomAccessFile = new RandomAccessFile("test1", "r");
int chunksRead = randomAccessFile.readInt();
for (int i = 0; i < chunksRead; i++) {
int size = randomAccessFile.readInt();
if (i == 1)// means we only want to read last chunk
{
byte[] bytes = new byte[size];
randomAccessFile.read(bytes, 0, bytes.length);
System.out.println(new String(bytes));
}
randomAccessFile.seek(4+(i+1)*size+4*(i+1));//From start so 4 int + i* size+ 4* i ie. size of i
}
輸出:
BYE
您必須在編碼中描述您的數據。 即添加一些元數據。
例如,數組的長度,然后是數組的數據。
這稱為序列化。
Array of int: length(4 bytes), data[0] (4 bytes), data[1] (4 bytes), data[2] (4 bytes)
有幾種方法可以做到這一點。 基本上首先要指出的是文件只是一個非結構化的字節序列。 任何字節。 基本上你想要o存儲幾個可變長度的字節數組。 這意味着你必須以某種方式添加結構,然后在閱讀時解析。
最簡單的可能是使用一些您視為分隔符的字節序列(具體到足以使其在數據中顯示的可能性很小)。
然后在寫入時,首先簡單地寫入你的字節,然后是分隔符
out.write(myarray);
out.write(separator);
out.write(anotherarray);
在閱讀時,您需要使用某種可以檢查的滑動窗口,以便您可以確定是否已閱讀分隔符。 基本上只是逐個遍歷字節,並保留你在某個緩沖區中讀取的最后幾個字節。 當您在緩沖區中看到分隔符時,您剛剛找到了數組的末尾。
對此的替代方案可以是寫入具有描述長度的標題的固定長度的塊,並且可以用於表示當前陣列是否存在另一個包。 然后你只需讀寫整個塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.