【问题标题】:Insert line by line data in txt file with arraylist使用arraylist在txt文件中逐行插入数据
【发布时间】:2019-04-21 01:18:31
【问题描述】:

我的节目是关于联系人的。 例如,当医生插入姓名,姓氏,电话时,每次他想将数据保存到 txt 文件中时,输出将是:

somename
somesurname
sometelephone

somename
somesurname
sometelephone
...

现在我做了输出将只有一行: somename somesurname sometelephone 你可以在代码中看到:

if(text.equals("Save")) {               
    try {       
        ArrayList<String> contactsinformations=new ArrayList<>();
        String name=tname.getText();
        String surname=tsurname.getText();
        String telephone=ttelephone.getText();
        contactsinformations.add(0,name+" ");
        contactsinformations.add(1,surname+" ");
        contactsinformations.add(2,telephone+" ");  

        FileWriter outFile = new FileWriter("Contacts.txt");
        BufferedWriter outStream = new BufferedWriter(outFile);                   
        for(int i=0; i<contactsinformations.size(); i++)
            outStream.write(String.valueOf(contactsinformations.get(i)));                
        outStream.close();
        JOptionPane.showMessageDialog(this,"Data saved.");  

    } catch(IOException e) {
        System.out.println("ERROR IN FILE");
    }
}

我使用 for 循环来获取 ArrayList 的大小,但试图弄清楚如何在不同的行中插入信息。

警告:已更新问题! 问题解决了!

if(text.equals("Save")) {               
                try
                {       

                    ArrayList<String> contactsinformations=new ArrayList<>();               
                    contactsinformations.add(tname.getText());
                    contactsinformations.add(tsurname.getText());
                    contactsinformations.add(ttelephone.getText());                 
                    FileWriter outFile = new FileWriter("Contacts.txt",true);
                    BufferedWriter outStream = new BufferedWriter(outFile);                   
                    for (int i = 0; i < contactsinformations.size(); i++) {
                        outStream.write(contactsinformations.get(i));   
                        outStream.newLine();
                    }
                    JOptionPane.showMessageDialog(this,"Data saved.");  
                    outStream.close();
                 }

【问题讨论】:

  • contactsinformationsArrayList&lt;String&gt; 所以它的 get 方法已经返回字符串。用String.valueOf 包裹它有什么意义?
  • BTW 每次调用new FileWriter("Contacts.txt") 时都会清除使用文件的内容。如果您想将文本附加到现有文件而不清除它,请查看How to add a new line of text to an existing file in Java?
  • 你也可以用PrintWriter 包裹BufferedWriter,它有println 方法。例如PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("Contacts.txt", true)));
  • @Pshemo 在PrintWriter pw = new PrintWriter(new FileWriter("Contacts.txt")); 之间不需要BufferedWriter 有效
  • @azro 是的,如果我们不需要 BufferedWriter 提供的缓冲。从我在source code of PrintWriter 看到的情况来看,它仅在处理OutputStreamFile fileString file 时自动添加BufferedWriter,但在处理其他Writer 时不会自动添加(尽管对于这种情况,缓冲可能仍由其他我没有注意到的方式)。

标签: java file arraylist


【解决方案1】:

使用:

outStream.write(contactsinformations.get(i) + "\n");

这里\n 表示新行。

【讨论】:

  • @TedHopp :我找不到BufferedWriterwriteln(),它是在更高的java 版本上吗?我在 java-8 上。
  • 是的。您说 \n 表示新行。我使用 \n 但输出是名称的第一个字母
  • 不,它只是空的
  • 使用调试器查看是否为列表分配了正确的值。在此之后添加新行是小菜一碟。
  • 我现在明白了。谢谢。
【解决方案2】:
  1. 由于ArrayList 保留插入顺序,您不需要精确index,您可以省略无用 变量name, surname, telephone

    contactsinformations.add(tname.getText());
    contactsinformations.add(tsurname.getText());
    contactsinformations.add(ttelephone.getText());
    
  2. 由于ArrayList 的类型是String,你不需要valueOf 方法

    for (int i = 0; i < contactsinformations.size(); i++) {
        outStream.write(contactsinformations.get(i));
        outStream.newLine();
    }
    
  3. PrintWriter 类有一种方法可以在一次调用中完成这两项工作(此处结合 for-each 循环)

    PrintWriter pw = new PrintWriter(outFile);
    for (String contactsinformation : contactsinformations) {
        pw.println(contactsinformation);
    }
    

【讨论】:

  • 最好使用outStream.newLine(),而不是写一个硬编码的"\n"
  • 你的意思是第一个这样使用它作为结果: ArrayList contactsinformations=new ArrayList();联系人信息.add(tname.getText()+" ");联系人信息.add(tsurname.getText()+" ");联系人信息.add(telephone.getText()+" ");
  • @RubenOchoaPerez 我已经编辑,不需要 +" " 因为它在行尾
  • 当我使用方法 3 时,我得到 null
【解决方案3】:

转换为CharArray 并写入BufferedWriter

for(int i=0; i< contactsinformations.size(); i++) {
    String str = contactsinformations.get(i) + "\n";
    outStream.write(str.toCharArray(), 0, str.length()); 
}

或者使用偏移量和长度写入字符串,方法同上:

for(int i=0; i< contactsinformations.size(); i++) {
    String str = contactsinformations.get(i) + "\n";
    outStream.write(str, 0, str.length()); 
}

【讨论】:

  • 请在发布您的答案之前考虑一下,如果您自己不思考,请查看另一个:valuefOf 100%无用,编写方法而不是编写方法的好处是什么经典的只有字符串?
  • 如果您的评论只是关于String.valueOf(),那么您是 100% 正确的。我编辑了。
【解决方案4】:
outStream.write(contactsinformations.stream()
         .collect(Collectors.joining(System.lineSeparator())));

【讨论】:

  • 请添加一些细节描述,以便任何人一眼就能理解您的答案。
猜你喜欢
  • 2019-03-26
  • 2014-09-19
  • 1970-01-01
  • 2021-03-30
  • 2019-01-24
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2017-01-20
相关资源
最近更新 更多