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

Posted

技术标签:

【中文标题】将标头记录(或字符串/文件)添加到 Scala / Java 中的大文件中【英文标题】:Prepend header record (or a string / a file) to large file in Scala / Java 【发布时间】:2018-11-20 01:09:14 【问题描述】:

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

例如

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

大文件是:

abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...

我希望得到:

header_information|123.45|xyz
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
abcdefghijklmnopqrstuvwxyz0123456789
...

【问题讨论】:

为什么不是普通的unix? @erip 因为在这种情况下它将是解决方法,其次它不一定总是 unix 文件系统,它可以是 AWS S3 或其他东西。 【参考方案1】:

我想出了以下解决方案:

    将前置字符串/文件转换为 InputStream 将大文件转为 InputStream 使用 java.io 将 InputStreams“组合”在一起。SequenceInputStream

    使用 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 秒。

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

【讨论】:

以上是关于将标头记录(或字符串/文件)添加到 Scala / Java 中的大文件中的主要内容,如果未能解决你的问题,请参考以下文章

仅从 Spark Scala DataFrame 写入标头 CSV 记录

使用 Laravel 5.0 存储门面将元数据、标头(Expires、CacheControl)添加到上传到 Amazon S3 的文件中

将单个 HTTP 标头的多个值添加到请求或响应的标准

将单个 HTTP 标头的多个值添加到请求或响应的标准

如何折叠Scala迭代器并获得延迟计算的序列作为结果?

如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?