像pickle一样在Java中存储数据的最佳方法

Posted

技术标签:

【中文标题】像pickle一样在Java中存储数据的最佳方法【英文标题】:best way to store data in Java like pickle 【发布时间】:2020-06-13 07:37:53 【问题描述】:

基本上,我只想将两个整数保存到一个文件中,以便下次程序启动时可以重用它们。我喜欢在 python 中像 pickle 一样做,因为把它写到一个 txt 文件中很麻烦。我已经阅读了一些文章和其他问题,他们说我应该使用 Java 序列化或 XML 或 JSON,但我不确定在我的情况下这是否正确。我想用最简单的方法。 非常感谢您尝试解决我的问题!

【问题讨论】:

【参考方案1】:

您可以使用序列化、XML 或 JSON(通常带有额外的库)。将配置数据存储在文件中的一种简单方法是使用 JRE 支持的 Java 属性文件,而无需任何额外的依赖项。属性文件是文本文件,具有简单的key=value 语法,见下文。要将两个值写入属性文件,您可以这样做

  String prop1 = "foo";
  String prop2 = "bar";

  try (OutputStream output = new FileOutputStream("config.properties")) 

      Properties prop = new Properties();

      // set the properties value
      prop.setProperty("prop1", prop1);
      prop.setProperty("prop2", prop2);

      // save properties to project root folder
      prop.store(output, "my app's config file");
   catch (IOException io) 
      io.printStackTrace();
      // TODO: improve error handling
  

应该会给你类似的东西

#my app's config file
#Sat Feb 29 12:29:27 CET 2020
prop2=bar
prop1=foo

然后加载它:

try (InputStream input = new FileInputStream("config.properties")) 

Properties prop = new Properties();

// load a properties file
prop.load(input);

// get the property value and print it out
String prop1 = prop.getProperty("prop1");
String prop2 = prop.getProperty("prop2");

System.out.println("prop1 = " + prop1);
System.out.println("prop2 = " + prop2);

 catch (IOException ex) 
  ex.printStackTrace();
  // TODO: improve error handling

对于整数值,您需要进行一些类型转换,例如前两行是

String prop1 = Integer.toString(23);
String prop2 = Integer.toString(42);

然后读取属性就变成了

int prop1 = Integer.parseInt(prop.getProperty("prop1"));
int prop2 = Integer.parseInt(prop.getProperty("prop2"));

如果属性数量增加或频繁更改,此解决方案无法很好地扩展。有关更通用的过程,请参阅此帖子:Get int, float, boolean and string from Properties

【讨论】:

非常感谢,它可以工作,但我不确定,因为在我的情况下,用户不应该能够更改值,而 .property 文件不就是这种情况吗? @JGStyleSSBU:您要求一种解决方案来保持软件两次运行之间的数字,您的想法是将它们存储在磁盘上的文件中。用户可以修改磁盘上的任何文件,只要您不通过应用访问权限和东西采取一些预防措施……无论该文件是属性文件还是其他文件。为了使值远离用户,请设置一个服务(如数据库或 Zookeeper 或其他东西)来存储数字……但我认为这对于您的要求来说太大了。也许您想看看 Java 中的 Preferences API? 我只是将变量的 James 更改为 Dome Numbers,以便 Theo the User Dozent 知道他在做什么 我保存的所有文件都增加了一个命中数

以上是关于像pickle一样在Java中存储数据的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

json与pickle模块

python pickle 模块的使用

将Java应用程序数据冗余存储在文件中的最佳方法是啥?

在java中存储sql查询的最佳方法是啥

序列化 pickle(重点) shelve json(重点)

在 Java 中序列化是存储和稍后访问(少量)数据的最佳/最简单的方法吗?