【问题标题】:Saving class to file?将课程保存到文件?
【发布时间】:2011-07-27 20:08:42
【问题描述】:

我正在编写一个程序,它是一个音乐播放器和一个歌词查找器。到目前为止,程序每次加载时都必须读取每个音乐文件并检索 ID3 标签以查找艺术家姓名、歌曲名称等。当读取多个文件时,提取 ID3 标签的过程非常耗时-消耗。我希望能够将 ID3 信息保存到程序的私有数据目录中,而不是每次运行程序时读取每个 ID3 标签。

我对序列化和保存/加载这样的东西感到困惑。我猜我应该使用 FileOutput/InputStreams 或 ObjectOutput/InputStreams 来实现这一点,但我无法掌握它们。有人可以帮助我并告诉我如何正确保存和加载我的“歌曲”课程吗?以下是我需要保存的变量。

public class Song implements Serializable
{
    private int index = 0, trackLength = 0;
    private Bitmap albumArtwork = null;
    private String toString, name, trackNumber, artist, album, lyrics, fileName, releaseDate;
}

如您所见,我需要跟踪一些字符串、两个整数和一个位图。有人可以告诉我如何将这些 arrayArrayList 保存到一个文件中,比如说,名为“music_info.sav”或类似的东西吗?另外,如何检查此文件是否存在(如果不存在,则将文件创建为空)?

【问题讨论】:

    标签: java android serialization


    【解决方案1】:
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("song.ser"));
        out.writeObject(yourArrayList);
        out.flush();
        out.close();
    

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("song.ser"));
        ArrayList<Song> myArrayList = (ArrayList<Song>) in.readObject();
        in.close();
    

    阅读。

    编辑

    我不确定 Bitmap 对象。您可能必须滚动自己的 readObject() 和 writeObject() 方法。

    private void writeObject(java.io.ObjectOutputStream out)
    private void readObject(java.io.ObjectInputStream in)
    

    这里是序列化和反序列化位图的链接。

    http://www.johnwordsworth.com/2011/06/serializing-and-de-serializing-android-graphics-bitmap/

    【讨论】:

    • Bitmap 会这样序列化吗?它没有实现 Serializable。
    • @dontoscata -- 你是对的。我没有注意到 Bitmap 对象。
    • 这就是我最初尝试的方式。我还是一头雾水。我有 2 个问题... 1. 你这样做的方式,文件必须存在。如果文件不存在,如何创建文件?我想您尝试制作 ObjectInputStream 并捕获异常。如果捕获到异常,请制作文件(但我不知道如何制作这个空文件)。 2. 这如何改变 ObjectInput/OutputStream 函数?我不知道你会在何时何地调用 writeObject 和 readObject。
    • 该文件不必存在。如果没有,FileOutputStream 将创建文件。如果它已经存在,它将覆盖它。您的 readObject 和 writeObject 方法将成为 Serializable 类的一部分(在本例中为 Song )
    • 所以我仍然可以调用 ArrayList myArrayList = (ArrayList) in.readObject();就像上面一样,它会在 Song 中隐式调用我的 readObject 方法(对于 writeObject 也是如此)?这是我感到困惑的部分。
    【解决方案2】:

    尝试使用 SQLLite 数据库来存储此信息,而不是滚动您自己的文件序列化。请参阅http://developer.android.com/guide/topics/data/data-storage.html,看看您是否可以做到这一点。

    【讨论】:

    • 创建一个 sqlite 数据库并将这些字段存储为列。这将允许快速访问以及排序/搜索能力。
    猜你喜欢
    • 2018-01-06
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多