写入没有重复的文本文件或覆盖其内容

时间:2017-11-26 19:56:39

标签: java

我有一个ArrayList,它包含一个用户名列表。

我试图将列表写入文本文件中,该文件将被保存,下次打开程序时,您可以继续扩展数组列表,其中文本文件将相应地延长。

起初它工作正常,但当我关闭程序时,一旦输入新用户名,列表就会被覆盖。然后我通过设置追加为true来修复此问题。但现在问题是它每次添加用户时都会附加整个列表,这导致我在dupplicates的文本文件中得到一个列表。我希望它在文本文件中添加一个新用户,当我关闭我的程序并再次打开它时,相同的文本文件就在那里,我仍然可以添加新用户而不覆盖或复制其内容。

 public void writemedlemmer() throws FileNotFoundException, IOException {




         try {

            String content = "";

            File file = new File("medlemlist.txt");

            // if file doesnt exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
            BufferedWriter bw = new BufferedWriter(fw);


            for (person elem : kontoArrayList) {

                fw.write(elem.getNavn());
            }


            bw.write(content);
            bw.newLine();
            bw.close();



        } catch (IOException e) {
            e.printStackTrace();
        }

    }

3 个答案:

答案 0 :(得分:1)

在我看来,你应该只追加列表的最后一个元素(或者你要写出的元素到文件的末尾)。 另一种方法是写出整个列表,重写前一个列表。

答案 1 :(得分:0)

使用列表

由于您希望支持重复的名称,我建议您使用列表和以下逻辑:

  • 从文件中读取时,记录列表的当前大小。将结果存储在变量中:int originalSize = list.size()
  • 在您的程序中,要求用户编写新名称并将其添加到列表中
  • 当您要求将列表保存到磁盘时,只需从索引originalSize开始编写列表。

    for (int i = originalSize; i < kontoArrayList.size(); i++) {
        fw.write(kontoArrayList.get(i).getNavn());
    }
    

使用LinkedHashSet

如果您没有具有重复的名称要求,LinkedHashSet将是更自然的选择。为了您的知识,我将其添加到我的答案中。

  • Set是一种集合类型,包含您插入其中的每个元素的唯一版本,即使您多次插入它也是如此
  • LinkedHashSet是保留广告订单的Set的具体实现。也就是说,如果按此顺序插入a, a, q, r, b, q, s,则您的集合将包含a, q, r, b, s,并在迭代时以原始顺序返回元素。

这样,您可以以有序且唯一的方式从文件加载元素,然后在集合的末尾插入新名称,最后将输出写回文件。

答案 2 :(得分:0)

在添加新元素之前,请按如下所示初始化列表, kontoArrayList = new ArrayList&lt;&gt;();