【发布时间】:2014-09-09 23:43:01
【问题描述】:
在将特定位写入文件时,我遇到了一些问题。如果这与任何内容重复,我深表歉意,但我无法通过搜索找到合理的答案。
我在以下方面有很多困难:
逐位写入标头(长整型)(转换为字节数组,因此 FileOutputStream 可以利用它)到文件。
-
将单个位写入文件。例如,在某个阶段,我需要将一个设置为 0 的位写入文件,所以我最初的想法是使用 BitSet,但 Java 似乎将其视为空值?
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 位?
【问题讨论】:
-
问题 2(第一个问题)您正在将值 0 写入文件,根据大多数字符集,这是空字符,因此它不会出现在大多数文本编辑器中。在更高的层次上,你为什么要使用比特?使用字节会容易得多。
-
BitSet在概念上应该是无限长并且有无限多个false位,因此将一位设置为false实际上应该对其没有影响。 -
感谢您的回复,我会尝试将位对齐到字节边界并写入。
标签: java file fileoutputstream bitset