7

在 Java 中运行的程序之间存储数据的最佳方式是什么?我已经知道您可以使用文本文件并以这种方式存储信息,但我想知道是否有更好的方法来存储程序在程序运行之间生成的信息。

另外,有什么办法可以保证信息的安全吗?具体来说,我想让最终用户无法访问它。

4

11 回答 11

6

我想知道是否还有其他方法可以在程序运行之间放置程序生成的信息?

只需使用 anObjectOutputStream将其序列化为文件并使用 anObjectInputStream将其取回。

还有什么办法可以保证信息的安全吗?从最终用户能够访问它?

如果代码在最终用户的系统上运行,那么不,没有办法阻止他们获取数据 - 甚至不值得您花时间尝试以某种方式对其进行编码,因为很容易附加调试器并检查程序的状态,而它是跑步。作为一种二进制格式,Java 序列化将防止非技术用户破译它,这几乎是您所希望的最好的。

于 2009-08-16T20:18:52.870 回答
5

我自己从未使用过它,但我认为这就是 JDK 的java.util.prefs.Preferences最初设计的目的。

于 2009-08-16T20:22:17.980 回答
2

您可以使用属性来存储信息。如果您想使其安全,请通过某种加密流运行它。

于 2009-08-16T19:34:30.793 回答
1

文件加密,或带密码的本地数据库。

于 2009-08-16T19:32:22.093 回答
1

您可以使用db4o来存储数据。它是一个对象数据库,支持加密。

于 2009-08-16T19:43:51.893 回答
1

您可能对 Java 的 Quick'n'dirty persistence感兴趣。

于 2009-08-16T20:24:12.157 回答
1

有人建议使用序列化。请注意,序列化有许多缺点。

  • 版本控制问题。如果您更改了序列化类中的某些内容,那么使用旧版本程序编写的序列化文件将无法再轻松读取。
  • 您不知道确切的文件格式。如果您以后想编写一个不同的程序(可能使用不同的编程语言)来读取文件,这将非常困难。

序列化不适合长期存储。

我建议改用小型嵌入式数据库。(嵌入式数据库是与您的程序在同一进程中运行的数据库)。请注意,Sun 的 Java 包括Java DB,它是 Apache Derby 的一个版本。还有HSQLDB,这是另一个可以用作嵌入式数据库的小型纯 Java 数据库。

于 2009-08-17T07:31:01.927 回答
0

开始使用 Java 时最好使用 ObjectOutputStream 或文本文件。一旦你有更多的经验,你就可以使用数据库。

于 2009-08-16T20:22:31.100 回答
0

序列化怎么样?

它不能被用户阅读,并且相对容易。

于 2009-08-16T20:50:51.967 回答
0

正如其他人所说,有无数种方法可以序列化数据。你可以使用轻量级的东西,比如 SQLite 或者只是简单的序列化。只要意识到您对数据进行加密的任何尝试都可能被击败,尤其是在 Java 代码的情况下,因为它很容易被逆转。

但是,如果您的大部分用户的技术水平不足以理解对 Java 程序进行逆向工程以弄清楚如何解密数据的复杂性,那么您应该能够摆脱一些基本的加密方法,例如另一个答案中提到的方法做个好人。只要意识到任何时候任何东西都驻留在您无法控制的机器上,没有办法阻止最顽固的用户弄清楚如何破解它。

我个人建议使用 sqlite 并对您放入字段中的数据使用一些简单的加密,因此如果有人足够聪明能够连接到本地数据库文件,他们仍然必须以某种方式反转您的加密算法。99.9% 的普通用户不会为这种级别的调查而烦恼。

于 2009-08-16T20:58:49.327 回答
0

作为一种序列化技术,XML 比对象序列化等二进制格式更能适应程序中的未来变化,这些变化将调整存储。然而,这将使它对大多数用户来说非常易读和可变。

一个非常简单的压缩/解压缩将阻止几乎所有用户获取数据的实际内容。在您当前的写入流周围使用 GZipInputStream/GZipOutputStream 将完成这项工作。你对窥探的防御越精细,它对你的软件用户的影响就越大。

于 2009-08-17T12:03:51.047 回答