关于效率,事实上,许多细节几乎没有什么不同。硬盘是目前为止涉及到的最慢的部分,在将单个字节写入磁盘所需的时间中,您可能已经将数千甚至数百万个字节转换为long。每一个性能测试在这里不会告诉你有关的任何性能
执行 ,但对性能 的硬盘 。毫无疑问,应该制定专门的基准,分别比较不同的转换策略和不同的书写方式。
假设主要目标是一种允许方便转换且不会造成不必要开销的功能,我想提出以下方法:
可以创建一个
ByteBuffer足够大的尺寸,将其视为a
LongBuffer,然后使用bulk
LongBuffer#put(long[])方法(该方法负责必要的字节序转换,并尽可能高效地执行此操作),最后,编写原始文件
ByteBuffer(现已填充)使用
long值)到文件
FileChannel。
遵循这个想法,我认为这种方法很方便并且(很可能)相当有效:
private static void bulkAndChannel(String fileName, long longArray[]) { ByteBuffer bytes = ByteBuffer.allocate(longArray.length * Long.BYTES); bytes.order(ByteOrder.nativeOrder()).asLongBuffer().put(longArray); try (FileOutputStream fos = new FileOutputStream(fileName)) { fos.getChannel().write(bytes); } catch (IOException e) { e.printStackTrace(); }}(当然,人们可能会争论分配“大”缓冲区是否是最好的主意。但是,由于有了
Buffer类的便利方法,可以很容易地并通过合理的努力对其进行修改,以写入适当大小的数据“块”。
,对于一个人真的想写一个 巨大的 数组,而创建相应数组的内存开销却实在
ByteBuffer太大了)



