java - 如何在 Java/Scala 中正确地将字节流保存到文件中?如何修复错误保存的流?

标签 java scala file-io bytestream

故事

在进行实验时,我保存了由硬件 RNG 设备生成的随机字节流。实验完成后,我发现保存方法不正确。我希望我能找到修复损坏文件的方法,以便获得正确的随机数流。

示例

这个问题的故事可以用下面的简单例子来解释。

假设我的输入文件 randomInput.bin 中有一个随机数流。我将通过 cat 将输入文件发送到 stdout 来模拟来自硬件 RNG 设备的随机数流。我找到了两种将此流保存到文件的方法:

A) 无害保存方法

此方法为我提供了原始的随机字节流。

import scala.sys.process._
import java.io.File

val res = ("cat randomInput.bin" #> new File(outputFile))!

B) 保存方法导致损坏

不幸的是,这是我选择的原始保存方法。

import scala.sys.process._
import java.io.PrintWriter

val randomBits = "cat randomInput.bin".!!

val out = new PrintWriter(outputFile)
out.println(randomBits)
if (out != null) {
  out.close()
  Seq("chmod", "600", outputFile).!
}

使用方法B)保存的文件仍然是二进制的,但是,它比使用方法A)保存的文件大大约2倍。进一步分析表明,随机比特流的随机性明显较低。

摘要

我怀疑保存方法B) 几乎为每个字节添加了一些内容,但是,对此的理解是我在 Java/Scala I/O 方面的专业知识的背后。

如果有人向我解释方法 A)B) 之间的低级差异,我将非常感激。目标是恢复通过保存方法B)创建的更改并获取原始的随机字节流。

提前非常感谢您!

最佳答案

问题可能是 println 用于文本,而该文本被编码为 Unicode,它对部分或全部字符使用多个字节,具体取决于 Unicode 的版本。

如果文件比应有的大小正好大 2 倍,那么您可能每隔一个字节就有一个空字节,这很容易修复。否则,可能很难弄清楚恢复二进制数据需要做什么。在十六进制编辑器中查看损坏的文件可能会帮助您了解发生了什么。不管怎样,我认为生成新的随机数据并正确保存可能更容易。

特别是如果这是一个实验,如果您的随机数据已被损坏然后修复,那么与一开始就正确生成数据相比,可能更难证明数据是真正随机的。

关于java - 如何在 Java/Scala 中正确地将字节流保存到文件中?如何修复错误保存的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58662616/

相关文章:

scala - 如何在 Scala 中进行默认方法处理

java - 如何使用java代码读取文件的所有行?

c - 有没有比我用 C 语言读取格式化文件更有效的方法?

c - 重定向输出

java - 如何设置从数据库获取数据的超时?

java - 面对 EDT 如何管理游戏状态?

java - 解决遗留 junit 测试套件中的 java classpath hell

Java压缩和分割库 - 最好是7zip

scala - 如何订购密封性状?

xml - 从 Scala 中的 StructType 中提取行标记架构以解析嵌套 XML