【问题标题】:How to save and load a Array in Java如何在 Java 中保存和加载数组
【发布时间】:2012-07-24 13:43:45
【问题描述】:

所以我正在创建一个程序来跟踪我观看的电视节目和电影。我有 2 个课程(电视和电影),我有一个可以容纳所有人的数组。我将如何保存这个数组,以便每次我使用该程序时,它都可以让我编辑同一个列表,因为每次我观看新剧集时,我都想用新信息更新我的数组。所以基本上我需要使用什么程序来不仅保存一个 arrya,而且每次运行程序时都加载数组?

【问题讨论】:

  • 从数据库/磁盘存储或其他地方加载阵列?
  • 我想将它存储在本地磁盘上。但是我从来没有使用过数据库,所以有没有办法重新加载一个数组?还是我必须使用某种类型的数据库?
  • 虽然对象序列化会起作用,但如果你能避免的话,我会的。它不处理对基础对象的更改(假设您想向对象添加评级字段,您将丢失所有存储的数据)。如果您不喜欢 XML,我会谨慎行事并使用 XML 格式甚至纯文件格式。

标签: java arrays loading save


【解决方案1】:

虽然您可以序列化您的对象并将其写入磁盘...我猜您只需将数组输出到文件并将其读回会更容易。您可以将数组中的每个元素写入很容易地循环文件,并同样容易地读回它。就像其他人说的那样,花时间研究 ArrayList 或类似结构是值得的!示例:

写入文件:

ArrayList<String> list = new ArrayList<String>();

// add stuff the the ArrayList

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("data.txt")));

for( int x = 0; x < list.size(); x++)
{
out.println(list.get(x));
}

out.close()

从文件中读取:

ArrayList<String> list = new ArrayList<String>();

Scanner scan = new Scanner(new File("data.txt"));

while(scan.hasNext())
{
list.add(scan.next());
}

【讨论】:

    【解决方案2】:

    为了保存数组以供进一步参考,您需要使类可序列化(例如,通过实现Serializable)。这意味着可以将对象转换为字节序列,这些字节序列可以保存到文件中或通过网络发送,以后可以用于在内存中重新创建对象

    然后您可以这样做将数据保存到文件中:

    ObjectOutputStream out = new ObjectOutputStream(
        new FileOutputStream("myarray.ser")
    );
    out.writeObject(myArray);
    out.flush();
    out.close();
    

    你可以这样读:

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("myarray.ser"));
    MyType[] array = (MyType[]) in.readObject();
    in.close();
    

    【讨论】:

    • 我认为值得对 Serializable 的含义做一个简短的总结。
    • @gobernador 不需要,因为上帝发明了 javadoc
    • @Bohemian 99% 的情况下,我完全同意,尽管我不得不说,在这种特殊情况下,Serializable 的 javadoc 有点难以理解,除非你已经理解了这个概念。
    • 这也适用于自定义对象,对吧? (只要您将它们声明为实现 Serializable?)还是只有一维数组?
    • @KalamariKing 相同的技术适用于自定义类型的Serializable 对象。当然需要在最后的代码sn-p的第二行调整类型转换。
    【解决方案3】:

    首先,您应该避免使用像瘟疫这样的数组...改用Collections,除此之外,它会根据需要自动扩展大小(您将需要它)。

    无论您使用数组还是List,您都可以通过将对象写入包装FileOutputStreamObjectOutputStream 来将对象序列化到磁盘。

    请注意,数组/列表中的对象必须实现Serializable,您的所有类字段也必须实现。

    要读回数组/列表,请从包装FileInputStreamObjectInputStream 中读取。

    您可以在 Google 上找到此类代码的无数示例。

    【讨论】:

    • “首先,你应该避免使用像瘟疫这样的数组......改用集合,除了其他任何东西之外,它会根据需要自动扩展大小(你需要这个)。”在这种特殊情况下,集合会更有用。这并不意味着任何人都应该“避免像瘟疫这样的阵列”。每种存储数据的方法都有其优点,否则它们将不存在,包括不可变的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多