【问题标题】:BigInteger(line.getBytes()) and Files.readAllBytes() giving different outputsBigInteger(line.getBytes()) 和 Files.readAllBytes() 给出不同的输出
【发布时间】:2016-01-08 16:23:54
【问题描述】:

我正在尝试在 Java 中实现霍夫曼压缩算法。我可以成功压缩字符串并将其写入文件(比如“compressed.java”)。现在我正在处理第二部分,我需要将“compressed.java”解压缩到原始文件。

我需要将文件中的每一行读取为位。所以当我有一个非常小的'compressed.java'文件时,我使用Files.readAllBytes(path)然后使用String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0'),将文件内容转换为一串位,然后逐位解析,我可以成功解压。但是当我有一个非常大的 'compressed.java' (11 MB) 文件时,Files.readAllBytes(path) 会花费很多时间。所以我想到了读取每一行,然后将其转换为字节流,然后逐位解析。所以我使用BufferedReader.readLine 读取每一行,然后使用新的BigInteger(line.getBytes()).toString(2) 转换为二进制字符串。但是这个字符串和我之前得到的不一样。

你能告诉我我哪里出错了。

【问题讨论】:

  • 不可能“按位”读取文件,使用 Java 可以获得的最小单位是字节 - 您可以自己将每个字节分成 8 位,并且可能做自己的事情,但仅此而已它。
  • 是的,我知道我无法将文件读取为位。如果我有一个小文件,使用 Files.readAllBytes(path) 可以快速运行,并且我能够解压缩压缩文件的内容。但是如果压缩文件很大, Files.readAllBytes(path) 会花费很多时间。我正在寻找的是一种将文件读取为字节块的方法。但是,问题仍然是原始文件中的一些字符将驻留在压缩文件中的两个不同字节中。这也需要注意。
  • docs.oracle.com/javase/7/docs/api/java/io/… 我认为您需要放弃当前的任务并首先从 Java 编程基础开始 - 如果不深入了解您选择的语言,就不可能实现像压缩算法这样复杂的东西

标签: java string file binary bits


【解决方案1】:

readLine() 删除行终止字符。它还返回字符,而不是字节。你在比较苹果和橘子。如果您想要所有字节,请使用 InputStream.read(byte[]) 循环。

【讨论】:

  • 我使用readLine() 读取的行使用line.getBytes() 转换为字节。
  • 这对其他问题没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2019-02-12
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多