将 header 记录(或字符串/文件)添加到 Scala 中的大文件 / Java

Prepend header record (or a string / a file) to large file in Scala / Java

在 Scala 中将字符串或文件添加到另一个大文件之前最有效(或推荐)的方法是什么,最好不使用外部库?大文件可以是二进制的。

例如

如果前置字符串是: header_information|123.45|xyz\n

大文件是:

abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...

我希望得到:

header_information|123.45|xyz
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...

我想出了以下解决方案:

  1. 将前置 string/file 转换为 InputStream
  2. 将大文件转为InputStream
  3. "Combine" InputStreams 一起使用 java.io.SequenceInputStream
  4. 使用java.nio.file.Files.copy写入目标文件

    object FileAppender {
      def main(args: Array[String]): Unit = {
        val stringToPrepend = new ByteArrayInputStream("header_information|123.45|xyz\n".getBytes)
        val largeFile = new FileInputStream("big_file.dat")
        Files.copy(
          new SequenceInputStream(stringToPrepend, largeFile),
          Paths.get("output_file.dat"),
          StandardCopyOption.REPLACE_EXISTING
        )
      }
    }
    

在约 30GB 的文件上进行了测试,在 MacBookPro (3.3GHz/16GB) 上花费了约 40 秒。

此方法可用于(如有必要)合并由例如创建的多个分区文件。星火引擎。