在 Java 中运行的程序之间存储数据的最佳方式是什么?我已经知道您可以使用文本文件并以这种方式存储信息,但我想知道是否有更好的方法来存储程序在程序运行之间生成的信息。
另外,有什么办法可以保证信息的安全吗?具体来说,我想让最终用户无法访问它。
在 Java 中运行的程序之间存储数据的最佳方式是什么?我已经知道您可以使用文本文件并以这种方式存储信息,但我想知道是否有更好的方法来存储程序在程序运行之间生成的信息。
另外,有什么办法可以保证信息的安全吗?具体来说,我想让最终用户无法访问它。
我想知道是否还有其他方法可以在程序运行之间放置程序生成的信息?
只需使用 anObjectOutputStream
将其序列化为文件并使用 anObjectInputStream
将其取回。
还有什么办法可以保证信息的安全吗?从最终用户能够访问它?
如果代码在最终用户的系统上运行,那么不,没有办法阻止他们获取数据 - 甚至不值得您花时间尝试以某种方式对其进行编码,因为很容易附加调试器并检查程序的状态,而它是跑步。作为一种二进制格式,Java 序列化将防止非技术用户破译它,这几乎是您所希望的最好的。
我自己从未使用过它,但我认为这就是 JDK 的java.util.prefs.Preferences最初设计的目的。
文件加密,或带密码的本地数据库。
您可以使用db4o来存储数据。它是一个对象数据库,支持加密。
开始使用 Java 时最好使用 ObjectOutputStream 或文本文件。一旦你有更多的经验,你就可以使用数据库。
序列化怎么样?
它不能被用户阅读,并且相对容易。
正如其他人所说,有无数种方法可以序列化数据。你可以使用轻量级的东西,比如 SQLite 或者只是简单的序列化。只要意识到您对数据进行加密的任何尝试都可能被击败,尤其是在 Java 代码的情况下,因为它很容易被逆转。
但是,如果您的大部分用户的技术水平不足以理解对 Java 程序进行逆向工程以弄清楚如何解密数据的复杂性,那么您应该能够摆脱一些基本的加密方法,例如另一个答案中提到的方法做个好人。只要意识到任何时候任何东西都驻留在您无法控制的机器上,没有办法阻止最顽固的用户弄清楚如何破解它。
我个人建议使用 sqlite 并对您放入字段中的数据使用一些简单的加密,因此如果有人足够聪明能够连接到本地数据库文件,他们仍然必须以某种方式反转您的加密算法。99.9% 的普通用户不会为这种级别的调查而烦恼。
作为一种序列化技术,XML 比对象序列化等二进制格式更能适应程序中的未来变化,这些变化将调整存储。然而,这将使它对大多数用户来说非常易读和可变。
一个非常简单的压缩/解压缩将阻止几乎所有用户获取数据的实际内容。在您当前的写入流周围使用 GZipInputStream/GZipOutputStream 将完成这项工作。你对窥探的防御越精细,它对你的软件用户的影响就越大。