【发布时间】:2016-05-03 09:22:22
【问题描述】:
我正在寻找一种将一些数据(List、Array 等)写入二进制文件的方法。放入二进制文件的集合表示点列表。我到现在为止的尝试:
[
11:17]
Welcome to Scala 2.12.0-M3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40).
Type in expressions for evaluation. Or try :help.
scala> import java.io.{FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream}
import java.io.{FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream}
scala> val oos = new ObjectOutputStream(new FileOutputStream("/tmp/f1.data"))
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@13bc8645
scala> oos.writeObject(List(1,2,3,4))
scala> oos.close
scala> val ois = new ObjectInputStream(new FileInputStream("/tmp/f1.data"))
ois: java.io.ObjectInputStream = java.io.ObjectInputStream@392a04e7
scala> val s : List[Int] = ois.readObject().asInstanceOf[List[Int]]
s: List[Int] = List(1, 2, 3, 4)
好的,它运行良好。问题是,也许明天我需要用另一种语言作为Python 来读取这个二进制文件。是否有一种更通用的二进制文件可以被多种语言读取的方法?
解决方案
对于在相同情况下搜索的人,您可以这样做:
def write2binFile(filename : String, a : Array[Int]) = {
val inChannel = new RandomAccessFile(filename, "rw").getChannel
val bbufer = ByteBuffer.allocateDirect(a.length * 4)
val ibuffer = bbufer.asIntBuffer()
ibuffer.put(a)
inChannel.write(bbufer)
inChannel.close
}
【问题讨论】:
-
你想使用二进制的原因是什么?是使文件变小还是隐藏其内容?在我的脑海中,BSON 听起来像是一种你可能会考虑的格式。不确定 Scala/Python 中的库支持,但一定有一些东西,因为 MongoDB 使用这种格式。
-
原因是我想将二进制文件存储在 Amazon S3 上并使用 aws java API 读取特定范围的字节。所以二进制文件不能特定于Java,这是我发帖的主要原因。
-
这取决于二进制格式,根据您的描述,您还需要某种索引或至少一种计算方法来知道哪些元素存储在哪个字节索引处?对于跨语言二进制序列化,我建议看看 Google Protobuffers。但是根据您的用例,您可能需要一些不同的东西来使您的字节查找工作。
-
投票结束为“过于广泛”。有很多方法可以做到这一点,并且许多格式可能会起作用。它也可能被认为是这个问题的重复:stackoverflow.com/questions/1421707/…
-
@ElmarWeber,我有一个 JSON 文件描述了每个二进制文件(样本数,开始时间)。选择格式是我可以使用 AWS Java API 轻松提取的字节序列。主要问题是是否有另一种方法可以将我的数据写入二进制文件。
标签: python scala binaryfiles