【问题标题】:What is the best multi-part base 64 encoder in java?java中最好的多部分base64编码器是什么?
【发布时间】:2024-01-11 22:25:01
【问题描述】:

我已经测试了不同的 base64 编码器 mig64、iHarder、sun 等。似乎这些需要将整个数据存储在内存中进行转换。

如果我想以多线程方式对大于 1gb 的大文件(流)进行编码,可以使用哪种编解码器实现而不损坏文件? commons 编解码器似乎具有 base64outputstream 包装器。还有其他解决方案吗?

说清楚,我有一个1TB的文件,这个文件需要base64编码。机器内存2GB RAM,用Java最快的方法是什么?

【问题讨论】:

  • 那么您对“最佳”的特定定义是“能够编码流”?
  • 您还有其他标准吗?正如目前所写,这个问题是主观的(来自标题)和/或“X 列表”请求(基于最后一部分)。
  • 以并发方式....让它成为文件即。固定字节流
  • 好的,我的意思是如果我必须编码更大的文件,标准将是大小与性能,即 n Gbs/小时
  • 如果您愿意测试更多的实现,您能否也比较一下我刚刚在github.com/jhorstmann/Base64 提出的实现?

标签: java multithreading file-io base64 encoder


【解决方案1】:

我不确定哪个编码器的副手速度更快,您必须测量每个编码器才能确定这一点。但是,您可以通过将文件分成块来避免内存问题并实现并发。只需确保将它们拆分为某个 6 字节边界(因为它在 Base64 中均匀地变成 8 个字节)。

我建议选择一个合理的块大小并使用ExecutorService 来管理固定数量的线程来进行处理。您可以在他们之间共享RandomAccessFile 并写信到适当的地方。您当然必须计算输出块偏移量(只需乘以 8 并除以 6)。

老实说,虽然您可能没有意识到并发在这里有多少性能提升。它可能会通过随机访问压倒硬盘驱动器。我将从使用单个线程将文件分块开始。先看看有多快。您处理 1GB 文件的速度可能比您想象的要快。作为一个粗略的猜测,我会在现代硬件上说 1 分钟,甚至写入你正在读取的同一个驱动器。

【讨论】:

  • 如何保证完整性,比如在76个字符后换行等?
  • 我不会在换行符处拆分它,您需要在固定的字节边界上拆分。如果你逐行阅读,那么你不能保证每一行都是 6 个字节的倍数。
  • 我的意思是写...输出应该有,根据规范,76 之后的换行符对于更大的块。即文件转换为另一个有字符的文件,根据规范在76个字符后会有换行
  • 啊,我明白了。您需要一个产生完整 76 个字符行的块大小。然后您可以计算目标偏移量。例如 3648 个输入字符将在 Base64 中产生 4864 个输出字符。那是64行输出。假设您在每行末尾有 2 个字节用于 CRLF,这会增加另外 128 个字节的输出。因此,对于每个 3648 字节的输入块,您将获得一个 4992 字节的输出块。只需为您正在处理的块写入文件中的正确偏移量即可。