使用BitSet和amp;将位写入文件FileOutputStream中

时间:2014-09-09 15:18:12

标签: java file fileoutputstream bitset

在将特定位写入文件时,我遇到了一些问题。如果这是任何重复,我很抱歉,但我找不到合理的答案。

我在以下方面遇到了一些困难:

  1. 逐位写入标题(Long)(转换为字节数组,所以 FileOutputStream可以将它用于文件。

  2. 将单个位写入文件。例如,在一个阶段我需要写一个设置为0的位到文件,所以我最初的想法是使用BitSet但Java似乎将此视为null?

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

  3. 1)

    我创建了一个FileOutputStream,如下所示,带有必要的文件名:

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

    我正在尝试创建一个" .amr"文件,所以我执行任何位操作之前的第一步是写一个标题到文件的开头。这具有以下价值:

    Long defaultHeader = 0x2321414d520aL;
    

    我尝试使用以下方法将此文件写入文件,但我很确定它没有写出正确的结果:

    fileOutputStream.write(defaultHeader.byteValue()); 
    

    我使用正确的流吗?我的转换完全错了吗?


    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位?

1 个答案:

答案 0 :(得分:1)

只有一件事可以写入OutputStream:bytes。你必须自己将比特组成字节;只有你知道如何将这些位组合成字节的规则。

至于像:

这样的东西
Long defaultHeader = 0x2321414d520aL;
fileOutputStream.write(defaultHeader.byteValue()); 

您应该仔细查看正在使用的方法的 javadocs byteValue()返回一个字节;所以当然它没有做你期望的事情。在oracles教程中可以很好地解释使用流:http://docs.oracle.com/javase/tutorial/essential/io/streams.html

对于写入单个位或位组,您需要一个自定义OutputStream来处理将位分组为要写入的字节。这通常称为 BitStream (JDK中没有这样的类);你必须自己写(我强烈推荐,它是一个非常好的练习教你有关比特和字节)或在网上找到一个。