在Java中将FloatBuffer或Float(float)数组写入文件的最快方法

3
我有一组浮点数据在一个FloatBuffer中,需要将其写入文件(不要花费三分钟)。目前使用DataOutputStream将FloatBuffer逐个元素地写入文件。这样速度很慢。最好使用FileChannel,但遇到了问题,因为似乎无法将FloatBuffer转换成ByteBuffer,而字节正是FileChannel需要的以便写入数据。
如果我使用数组作为数据源,那么替代FloatBuffers是很容易的。但我不能轻松地使用ByteBuffer /数组。
非常感谢您对此问题的任何见解。谢谢。
1个回答

4

不要使用FloatBuffer,而是创建一个ByteBuffer用于写入FileChannel,然后使用ByteBuffer.asFloatBuffer将数据写入FloatBuffer,最后写出包含相关信息的ByteBuffer

个人认为java.nio总是让人感到困惑,但这种方法应该可以正常工作...

编辑:另一位用户尝试过此方法,但发现它不能正常工作:

However, asFloatBuffer() will not work because hasArray() will be false. In short, the following does not work (neither allocate, nor allocateDirect will work):

ByteBuffer.allocate(amount * 4).asFloatBuffer().asArray()

很遗憾,目前我没有时间调查其他替代方案。


好的,我忘记了ByteBuffer有一个putFloat函数。这个很有效。使用FileChannel会快得多。谢谢。 - user8709
@user756670:它有putFloat,但那是单次操作。使用asFloatBuffer允许您进行批量放置,这可能更好。 - Jon Skeet
我有一个返回FloatBuffer对象的外部库,所以我不能使用ByteBuffer开始。我该怎么办? - Aleksei Petrenko
@AlexPetrenko:请参见https://dev59.com/mYbca4cB1Zd3GeqPRRZN - Jon Skeet
我的FloatBuffer上没有这样的方法。没有返回ByteBuffer的方法,我已经检查过了。我使用的是Android。 - Aleksei Petrenko
@AlexPetrenko:我在写完评论后很快就进行了编辑 - 你有查看相关的问题吗?如果那并没有对你有所帮助,我的建议是提出一个更详细的新问题 - 特别是针对 Android。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接