簡體   English   中英

使用BitSet和FileOutputStream將位寫入文件

[英]Writing Bits to a file using BitSet & FileOutputStream

在將特定位寫入文件時,我遇到了一個問題。 如果這是任何重復的內容,我深表歉意,但是我進行的搜索找不到合理的答案。

我在以下方面遇到許多困難:

  1. 將文件頭(長整數)一點一點寫入(轉換為字節數組,以便FileOutputStream可以利用它)到文件中。

  2. 將單個位寫入文件。 例如,在某個階段,我需要將一個設置為0的位寫入文件,因此我最初的想法是使用BitSet,但是Java似乎將此視為null?

     BitSet initialPadding = new BitSet(); initialPadding.set(0, false); fileOutputStream.write(initialPadding.toByteArray()); 

1)

我使用所需的文件名創建一個FileOutputStream,如下所示:

FileOutputStream fileOutputStream = new FileOutputStream(file.getAbsolutePath());

我試圖創建一個“ .amr”文件,因此在執行任何位操作之前的第一步是將標頭寫入文件的開頭。 具有以下值:

Long defaultHeader = 0x2321414d520aL;

我嘗試使用以下方法將其寫入文件,但我很確定它不會寫入正確的結果:

fileOutputStream.write(defaultHeader.byteValue()); 

我使用的是正確的流嗎? 我的convert依完全錯誤嗎?


2)

我有一個public BitSet fileBitSet; 從“ .raw”文件中讀取的位作為輸入。 我需要能夠從BitSet中提取某些位,以便稍后將其寫入文件。 我使用以下方法執行此操作:

public int getOctetPayloadHeader(int startPoint) {

    int readLength = 0;

    octetCMR = fileBitSet.get(0, 3);
    octetRES = fileBitSet.get(4, 7);

    if (octetRES.get(0, 3).isEmpty()) {

        /* Keep constructing the payload header. */

        octetFBit    = fileBitSet.get(8, 8);
        octetMode    = fileBitSet.get(9, 12);
        octetQuality = fileBitSet.get(13, 13);
        octetPadding = fileBitSet.get(14, 15);
        ... }

考慮到有時可能需要我在fileBitSet中的特定偏移量寫入單個位或81位,將這些位寫入文件的最佳方法是什么?

您只能寫一件事到OutputStream:字節。 您必須自己將位組成字節。 只有您知道規則如何將位組合為字節。

至於這樣的東西:

Long defaultHeader = 0x2321414d520aL;
fileOutputStream.write(defaultHeader.byteValue()); 

您應該仔細查看所使用方法的javadocs byteValue()返回一個字節; 所以它當然沒有按照您的期望做。 在Oracle教程中對使用流進行了很好的解釋: http : //docs.oracle.com/javase/tutorial/essential/io/streams.html

為了寫入單個位或一組位,您將需要一個自定義OutputStream,該處理將這些位分組為要寫入的字節。 那通常稱為BitStream (JDK中沒有此類); 您必須自己編寫(我強烈建議這樣做,它是一個很好的練習來教您有關位和字節的知識),或者在網上找到一個。

暫無
暫無

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

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