【发布时间】: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 个字节长。
-
您是说您有包含
0和1字符的文本,并且您想将它们表示的位转换为数据?您可以一次读取 8 个字符,调用Integer.parseInt(substring, 2),然后将解析后的 int 值传递给OutputStream.write。