【问题标题】:Store local data in java? [closed]在java中存储本地数据? [关闭]
【发布时间】:2012-11-21 00:31:41
【问题描述】:

我正在使用 Java 进行简单的文本冒险。我希望能够定义每个任务的进度,并将其存储在用户的应用数据中,以便下次他们玩游戏时读取。我该怎么做?

【问题讨论】:

  • 您能说得更具体一点吗?您是想弄清楚哪些 API 可以让您执行此操作,还是担心跨连接保存的安全问题?
  • 欢迎来到 StackOverflow!关于 SO 的问题往往是涉及一些代码的非常具体的问题。你的问题很模糊;它可能会被否决甚至关闭。你能说得更具体一点吗?也许包括一些你已经尝试过的代码?
  • 我不认为你的游戏有很多数据要存储。存储的整个想法是制作一个文件,放入一些东西来代表你的位置,将它保存在硬盘上,然后在需要时检索它。您要做的第一件事是准确地确定您需要存储什么以获得所需的结果。如果它是一点点信息,一个小文本文件就可以了。如果它很多,那么也许你会想要使用数据库。下面的答案提供了一些很好的存储技术,但我想在推荐任何东西之前先看看一些代码。

标签: java text storage


【解决方案1】:

如果您只想在内部存储数据(即跨会话保存,但不作为用户可读文件),我会使用 Preferences API

例如:假设您有一个名为MissionInfo 的类,它实现了java.io.Serializable。您可以执行以下操作:

// Precondition: missionInfoToSave is an variable of type MissionInfo

// The key used to store the data.
final String key = "SAVE_DATA";

// Get the preferences database for this package.
Preferences prefs = Preferences.userNodeForPackage(MissionInfo.class);

// To save, write the object to a byte array.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(missionInfoToSave); // write it to the stream
    prefs.putByteArray(key, baos.toByteArray());
} catch (IOException ie) {
    System.err.println("Failed to save to file");
}

// To load, read it back.
// The second argument is the default if the key isn't found.
byte[] stored = prefs.getByteArray(key, null);
if (stored == null) {
    // There's no stored data.
    return;
}
ByteArrayInputStream bais = new ByteArrayInputStream();
try {
    ObjectInputStream ois = new ObjectInputStream(bais);
    Object o = ois.readObject();
    if (o instanceof MissionData) { 
        // Good: it's a saved data file.
        updateMissionProgress((MissionData) o); // assuming this is defined
    }
} catch (IOException ie) {
    System.err.println("Couldn't load from prefs");
} catch (ClassNotFoundException cnfe) {
    System.err.println("Class couldn't be found");
}

Preferences API 将跨会话存储数据。你可以在包java.util.prefs中找到它。

【讨论】:

  • 我正在编组为 XML,但运气不佳。我没有尝试太多其他方法,因为我是一名 Java 编码新手。
  • 如果您了解如何写入 XML,您的问题是什么? XML 应该可以正常工作。
【解决方案2】:

使用简单的数据库:sqlite 或 Berkeley DB http://docs.oracle.com/cd/E17277_02/html/index.html

【讨论】:

  • 或 Derby,JDK 附带的关系数据库。
  • 这需要在每个用户的操作系统上安装数据库软件。即使假设用户拥有 JDK 也有些牵强,因为大多数人都拥有 JRE。
【解决方案3】:

我建议您在用户主目录中创建一个特定于应用程序的文件夹,您可以使用以下代码获取该文件夹:

String userHome=System.getProperty("user.home");

这将为您提供一个类似于 c:\Documents and Settings\user1 的字符串,然后您可以在该字符串上附加您的应用程序名称,例如“adventureapp”,首先使用正斜杠。然后从那。你可以这样做:

File file = new File(mypathtomyappfolder);

然后你测试如果 .isDirectory() 如果不是,这是用户第一次运行 app do file.newDir() 所以你有你的冒险应用目录。然后从那里使用 File 并将文件名附加到您的字符串中,例如 user.properties,您可以根据他们在游戏中的进展对其进行读写。希望有帮助。 - 邓肯

【讨论】:

    【解决方案4】:

    您可以使用java.util.Properties,这是一个方便的实用程序,用于创建键和值的映射、将其存储在文件中以及从该文件加载相关的Properties 对象。关于使用 Java 的 Properties 处理文件的一个很好的教程可以在 here 找到。

    要获取 AppData 目录文件路径(在 Windows 中),您可以使用System.getenv("APPDATA")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多