【问题标题】:Best way to store data between program runs in java?在java中运行的程序之间存储数据的最佳方式?
【发布时间】:2009-08-16 19:28:23
【问题描述】:

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

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

【问题讨论】:

    标签: java storage information-hiding


    【解决方案1】:

    我想知道有没有办法 其他放置的信息是 由程序在运行之间生成 程序?

    只需使用ObjectOutputStream 将其序列化为文件,然后使用ObjectInputStream 将其取回。

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

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

    【讨论】:

    • 当然没有什么能阻止他序列化到一个受压缩和/或加密的流。它永远不会牢不可破,但可能非常接近牢不可破。如果值得吗?在大多数情况下可能不会。
    • 没有。如果加密流的应用程序在最终用户的机器上运行,那么任何类型的加密都绝对是浪费时间,因为正如我所写的,在调试模式下运行它并在数据被加密之前抓取数据非常容易(除了应用程序必须包含加密密钥这一事实之外)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以使用Properties 来存储信息。如果您想让它安全,请通过某种encryption stream 运行它。

      【讨论】:

      • 如果你想做得过火,请滚动你自己的二进制格式并加密它。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            序列化不适合长期存储。

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                序列化怎么样?

                用户看不懂,比较容易。

                【讨论】:

                  【解决方案10】:

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

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

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

                  【讨论】:

                  • 另外,92.3% 的统计数据都是现场制作的!
                  【解决方案11】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2012-10-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-09-10
                    相关资源
                    最近更新 更多