(Java)Saving/Loading 使用属性的 ArrayList

(Java) Saving/Loading an ArrayList using Properties

我一直在研究为我的应用程序保存和加载配置设置的不同方法。我查看了 PreferencesJSONProperties 和 XML,但我想我已经决定在我的大部分应用程序设置中使用 Properties 方法.

但是,我无法找到有关如何最好地从该文件保存和加载 ArrayList 的任何信息。似乎只有 key/pair 种可能的字符串组合。

所以我的问题基本上是,有没有更好的方法来做到这一点?我的应用程序中有 ArrayList 个字符串,我需要能够保存和加载它们。这可以用 Properties 来完成,还是我需要使用一个单独的文件来保存这个列表,然后将其作为 ArrayList (也许是每行)读入?

编辑:我应该提一下,我想将所有配置文件保留为可读文本,因此我避免使用 Serialization.

您可以使用逗号将多个值放在同一个键上。

key:value1,value2,value3

然后在读取它们后使用字符串的拆分函数拆分它们,这将为您提供一个 String[] 数组,可以通过 Arrays.asList().[= 将其转换为 ArrayList 15=]

这是部分 MCVE:

ArrayList<String> al = new ArrayList<>();
al.add("value1");
al.add("value2");
al.add("value3");

String values = al.toString();
//Substring used to get rid of "[" and "]" 
prop.setProperty("name",values.substring(1,values.length() - 1);

我见过两种将列表写入 Properties 文件的方法。一种是通过将索引添加到 属性 的名称来将列表的每个元素存储为单独的条目——类似于 "mylist.1""mylist.2"。另一种是将元素做成单值,用分隔符分隔。

第一种方法的优点是您可以处理任何值而不用担心如果该值包含分隔符该怎么办。第二个的优点是您可以检索整个列表而无需遍历 Properties.

中的所有条目

无论哪种情况,您都可能希望围绕 Properties 对象编写一个包装器(或查找一个库),以使用您选择的任何方案添加方法来存储和检索列表。这些包装器通常具有验证和转换其他常见数据类型(如数字和 URL)的方法。

我发现使用以下组合在我的案例中效果很好。

保存:

String csv = String.join(",", arrayList());
props.setProperty("list", csv);

这将创建一个 String,其中包含 ArrayList 的每个元素,以逗号分隔。

加载:

arrayList = Arrays.asList(csv.split(","));

获取 csv 字符串并在每个逗号处将其拆分,将元素添加到 arrayList 引用。