簡體   English   中英

使用Java在文件中寫入和讀取多個byte []

[英]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.

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