2009-08-16 227 views
5

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

此外,有没有办法做到这一点,以保持信息的安全?具体而言,我想让最终用户无法访问它。

回答

5

我想知道是否有任何方式,是通过 运行程序的 之间的程序genereated 其他配售的信息?

只需使用ObjectOutputStream将其序列化为一个文件,然后使用ObjectInputStream将其恢复。

也有没有办法做到这一点,如 保持信息的安全?从 最终用户能够访问它?

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

+0

当然,没有任何事情阻止他从序列化到压缩和/或加密主题的流。它永远不会牢不可破,但可能非常接近牢不可破。如果它是值得的?可能不是在大多数情况下。 – Fredrik 2009-08-16 21:07:16

+1

不可以。如果加密流的应用程序正在最终用户的机器上运行,那么任何类型的加密都是绝对浪费时间,因为正如我写的那样,在调试模式下运行它非常容易,并且可以在抢先数据之前它被加密(除了应用程序必须包含加密密钥)。 – 2009-08-16 21:16:42

1

对文件或带密码的本地数据库进行加密。

2

您可以使用Properties来存储信息。如果你想保证安全,请运行某种encryption stream

+0

如果您想过度使用它,请将您自己的二进制格式加密并加密。 – Esko 2009-08-16 19:37:51

1

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

0

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

0

如何序列化?

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

0

正如其他人所说,有很多方法来序列化数据。你可以使用像SQLite这样的轻量级或简单的序列化。只要认识到你对数据进行加密的任何尝试都可能被破坏,特别是在Java代码的情况下,因为它可以很容易地颠倒过来。然而,如果你的大部分用户不够技术,无法理解Java程序的逆向工程的复杂性以找出如何解密你的数据,那么你应该能够避免使用一些基本的加密方法,比如什么是在另一个答案中提到并且很好。只要意识到任何时候任何东西驻留在你不能控制的机器上,就没有办法让最持久的用户不知道如何破解它。

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

+0

此外,92.3%的统计数据是当场编写的! – MattC 2009-08-16 20:59:28

+0

@MATC:你弄错了,它是97%:-D – Fredrik 2009-08-16 21:08:19

1

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

  • 版本控制问题。如果你在被序列化的类中改变了某些东西,那么用旧版本的程序编写的序列化文件就不能再被轻易读取。
  • 您不知道确切的文件格式。如果你想稍后编写一个不同的程序,可能是用不同的编程语言,需要读取该文件,这将是非常困难的。

序列化不太适合长期存储。

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

0

XML作为一种序列化技术,对将来的程序更改具有更强的适应性,可以调整存储量而不是二进制格式,如对象序列化。但是,这会使大多数用户非常容易阅读和更改。

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

相关问题