【问题标题】:Writing array data to a binary file in Java在 Java 中将数组数据写入二进制文件
【发布时间】:2018-03-12 18:20:40
【问题描述】:

我正在尝试以二进制形式存储以下数组,然后再将它们读回:

private int[10] number;
private String[10] name;
private int[10] age;

将它们存储到二进制文件并在之后读回它们的最佳方法是什么?每个数组的示例值为:

number[0] = 1; name[0] = "Henry"; age[0] = 35;

所以数据属于一类。

编辑:基本上我想使用二进制文本文件存储来自变量(数组)的数据,二进制是必须的,然后再读回数据。所以简而言之,我想要一种存储数据的方法,所以当我关闭应用程序数据不会丢失并且可以在每个会话中检索。

【问题讨论】:

  • 你可以使用类似的键值对,但值用逗号分隔,如下所示? 0=1,亨利,35
  • 对象序列化器?杰森? XML?按该顺序探测我的前 3 名。
  • 必须是3个不同的数组?你能存储一个对象吗?
  • @royalGhost 也许,它必须是二进制的
  • @BernardoRocha 是的,它必须是 3 个不同的数组,除非您可以按照我认为您尝试通过存储对象来建议的方式将它们组合起来?我想使用类似 FileWriter 或 OutputStreamWriter 的东西

标签: java arrays binary save


【解决方案1】:

您可以编写自定义编码器和解码器,例如通过使用String.getBytes()String 映射到byte[],然后使用OutputStream.write() 方法写入每个字节。问题是您所说的“最佳方式”是什么意思,因为:

  1. 您需要支持不同的语言环境吗? String 区域设置是什么,getBytes() 使用平台的默认字符集。
  2. 您是否需要压缩二进制数据以节省空间,因为String 可能很长或很短。
  3. 您打算与其他应用程序共享二进制文件吗?如果是这样,最好使用几种语言支持的格式,例如Google Protobuf

如果要在应用程序之外读取文件,那么 Protobuf 似乎是一个明智的选择。然而,对于 Hello World 应用程序来说,这将是一种过度杀伤力。

最简单的方法是使用ObjectOutputStreamObjectInputStream,但这远非漂亮:

String fileName = "data.set";

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName))) {
  for (int n : number) {
    out.writeInt(n);
  }
  for (String n : name) {
    out.writeUTF(n);
  }
  for (int a : age) {
    out.writeInt(a);
  }
}

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName))) {
  for (int i = 0; i < number.length; i++) {
    number[i] = in.readInt();
  }
  for (int i = 0; i < name.length; i++) {
    name[i] = in.readUTF();
  }
  for (int i = 0; i < age.length; i++) {
    age[i] = in.readInt();
  }
}

【讨论】:

  • 二进制文件不会与其他应用程序共享。它只是用来将变量保存到文本文件(二进制文件是必须的)并从它们读取,所以当我关闭应用程序时,数据不会丢失。
  • 如果不是 Hello World 应用程序,我会选择 Protobuf。这很简单。只需将您的数据包装成一个类型:看起来您可以使用 numbernameage 作为 Person 字段创建 new Person[10]。然后创建一个.proto 文件,从.proto 文件生成Java 类并将其用作show here。或者,您可以使用 ObjectInputStream/ObjectOutputStream 使用标准 Java 序列化,但您仍然需要为您的数据使用包装类。
  • @Walt 添加了Java序列化的例子
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2014-05-18
  • 2012-09-11
相关资源
最近更新 更多