在将特定位写入文件时,我遇到了一些问题。如果这是任何重复,我很抱歉,但我找不到合理的答案。
我在以下方面遇到了一些困难:
逐位写入标题(Long)(转换为字节数组,所以 FileOutputStream可以将它用于文件。
将单个位写入文件。例如,在一个阶段我需要写一个设置为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());
我使用正确的流吗?我的转换完全错了吗?
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位?
答案 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中没有这样的类);你必须自己写(我强烈推荐,它是一个非常好的练习教你有关比特和字节)或在网上找到一个。