【问题标题】:How to write a single bit in a file in Java如何用Java在文件中写入一个位
【发布时间】:2020-07-10 06:45:38
【问题描述】:

我想知道是否可以一点一点地写入文件。我有几个写成字符串的位序列

String bitString = "00101101"; // as an example for just one sequence

当我尝试将此序列写入文件 (txt) 时,它并没有给我预期的结果。我的文件重 8 个字节,我希望它只有 1 个字节(8 位:我的 00101101)。

所以我的问题是:将字符串或整数直接作为二进制文件写入文件的最简单方法是什么?

提前致谢。

编辑

我提出了我的问题:

我有一个从输入文件中读取的输入字符串(任何文本文件,所以我不知道它是什么字符串)让我们以“Hello World”为例。

我正在使用我创建的使用 HuffMan 树方法的文本压缩算法。对于我的示例,它返回与我的文本相对应的位序列(这是为了解释,我们并不真的需要这部分),它为我提供了以下位序列:00001100 11011011 10000101 11101011,它比原始二进制文件更轻我的文本的值(原始文本为 11 个字节,压缩后为 4 个字节)。

我想做的是在输出文件中写入这个新序列,我希望每个字符都被视为一个位(或每个 8 个字符被视为一个字节),因此,输出文件应该比我的输入文件轻。

但问题是,当我尝试编写新序列时,每个字符都被视为一个字节而不是一个位,并且输出文件比输入文件重。

我已经尝试了很多东西,例如 FileOutputStream、OutputStream、 将我的字符串转换成字节,转换成整数,...

这是我想要做的:

String optimizedString = "00001100110110111000010111101011";  // size always multiple of 8
byte outputByte = 0;
try (OutputStream fos = new FileOutputStream("textCompressed.txt")) {           
    for (int i = 0; i < optimizedString.length(); ++i) {
        if (optimizedString.charAt(i) == '1') {
            outputByte = (byte) (outputByte << 1 + 1); // add 1 to the sequence
        } else {
            outputByte = (byte) (outputByte << 1 + 0); // add 0 to the sequence
        }

        if ((i+1) % 8 == 0) { // print each byte in the output file
            fos.write(outputByte);
            outputByte = 0; // reset the byte for the next sequence
        }
     }
}

但结果,outputByte 始终为 0。

我希望我更清楚

【问题讨论】:

  • 从技术上讲,您不能写入少于一个磁盘扇区(通常约为 1k 到 4k 字节)。文件系统只是假装 4k 扇区只有 8 个字节长。
  • 您是说您有包含01 字符的文本,并且您想将它们表示的位转换为数据?您可以一次读取 8 个字符,调用 Integer.parseInt(substring, 2),然后将解析后的 int 值传递给 OutputStream.write

标签: java file byte bit


【解决方案1】:

你不能写少于一个字节,你的文件是 8 个字节的原因是因为你写了 8 个字符。如果您有 Writer 并执行以下操作:

writer.write(0b00101101)

它会做你想做的事。基本上,它使用二进制符号来定义 int 并将这个 int 写为单个字符,而不是将其写为二进制表示的字符串。

【讨论】:

  • 为什么是 Writer 而不是 OutputStream?作家对文本进行编码;使用 UTF-16 字符集的 OutputStreamWriter 将为该值写入两个字节。另一方面,OutputStream 总是会写入一个字节。
  • 感谢您的回答,我看到了这种方法,但是如果我不知道位序列怎么办?我的意思是有一个动态的方式来做到这一点?因为我知道我不能做 writer.write(0b + bitString) 其中 bitString 是我的位序列
  • @VGR 我想我对两者之间的微妙之处并没有那么深,我一直在几乎可以互换使用它们。当我有时间检查我的答案时,我可以做一些测试。
  • @CédricCosson 如果你想在某个时候写一个字节,你必须知道它是什么字节。你的输入是什么?它是如何表示的,谁给你的?
  • 写入器写入字符,而不是单个字节。 Unicode 有数十万个代码点;它们中的大多数是需要超过八位的值。如果写入基于字节的资源(如文件或套接字),则必须使用 UTF-8 之类的字符集将每个字符编码为字节。任何设置了高位的字节都将被编码为 UTF-8 中的多个字节。另一方面,OutputStream 直接写入字节,而不对赋予它的值进行任何编码(通常)。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 2015-02-02
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多