【问题标题】:(Java) Saving/Loading an ArrayList using Properties(Java) 使用属性保存/加载 ArrayList
【发布时间】:2016-08-04 15:48:53
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java json arraylist collections properties-file


    【解决方案1】:

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

    key:value1,value2,value3
    

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

    这是部分 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 文件的示例代码吗?我认为这将是在setProperty() 方法中通过我的数组进行某种类型的迭代,对吧?
    • 我实际上只是创建一个代表String 来通过。我会在一秒钟内发布经过验证的代码。
    • 与此同时,我将尝试将此String 作为值传递:String csv = String.join(",", arrayList)
    • 添加了获取逗号分隔列表的方法。
    • 为什么不使用al.toString()
    【解决方案2】:

    我发现在我的情况下使用以下组合非常有效。

    保存

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

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

    加载

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

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

    【讨论】:

    • 这对我不起作用,编译器说:“不兼容的类型。必需的 ArrayList 但 'asList' 被推断为 List:没有类型变量的实例) T 存在使得 List 符合 ArrayList
    • 您需要在ArrayList. 中指定保存的数据类型,您收到的错误消息应该说明这一点。此方法也仅适用于字符串,因此您需要将 ArrayList 定义为:ArrayList&lt;String&gt; arrayList;
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多