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

时间:2018-11-20 01:09:14

标签: scala io prepend

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

例如

如果前缀字符串为: header_information|123.45|xyz\n

大文件是:

abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...

我希望得到:

header_information|123.45|xyz
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...

1 个答案:

答案 0 :(得分:0)

我提出以下解决方案:

  1. 将前置的字符串/文件转换为InputStream
  2. 将大文件转换为InputStream
  3. 使用java.io将“ Combine” InputStreams组合在一起。 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秒。

可以使用这种方法(如有必要)来组合由例如火花引擎。