【问题标题】:Using printwriter to create a text file with several rows from a list使用 printwriter 从列表中创建包含多行的文本文件
【发布时间】:2019-05-03 05:32:28
【问题描述】:

我正在尝试使用 try 和 catch 创建一个文本格式的逗号分隔文件。为此,我正在使用库 PrintWriter。但是,我无法逐行打印所有行。我创建了一个列表来存储我在每次迭代中创建的每一行,然后我尝试在列表上使用 for 将每个元素打印为文件中的一行:

for(int i=0;i<listA.size();i++) {
    writer.println(listA.get(i));
}

但是,我在文件中得到的结果是

Name_DS_1,LineString_1,UFI_1,Name_DS_2,LineString_2,UFI_2
Name1,Line1,Ufi1,Name2,Line2,Ufi2

我期待:

Name_DS_1,LineString_1,UFI_1,Name_DS_2,LineString_2,UFI_2
Name1,Line1,Ufi1,Name2,Line2,Ufi2
Name1,Line1,Ufi1,Name2,Line2,Ufi2
Name1,Line1,Ufi1,Name2,Line2,Ufi2

我的整个代码是:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class App {

    public static List listA = new ArrayList();

    public static void main(String[] args) {
        matchSplits();
    }

    public static void matchSplits()
    {
        String header = "Name_DS_1" + "," + "LineString_1" + "," + "UFI_1" + "," + "Name_DS_2" + "," + "LineString_2" + "," + "UFI_2" + "\r\n";
        String fileName = "D:\\WIP\\test\\Coordinates.txt";  
        File file = new File(fileName);      
        int matchCount = 0;

        try (PrintWriter writer = new PrintWriter(file)) {
            for (int k=0;k<3;k++) {
                //Here I am inserting the header only in the first iteration. 
                if(matchCount == 0) {
                    writer.write(header);
                }

                String Name_DS_1 = "Name1";
                String LineString_1 = "Line1";
                String UFI_1 = "Ufi1";
                String Name_DS_2 = "Name2";
                String LineString_2 = "Line2";
                String UFI_2 = "Ufi2";              
                String line = Name_DS_1 + "," + LineString_1 + "," + UFI_1 + "," + Name_DS_2 + "," + LineString_2 + "," + UFI_2 + "\r\n";

                listA.add(line);

                for(int i=0; i<listA.size(); i++) {
                    writer.println(listA.get(i));
                }

                writer.close();
                matchCount++;
            }                 
        }    
        catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }
}

【问题讨论】:

  • 代码执行预期的操作。您似乎只有一行,这意味着它会打印该行一次。要获得更多行,您需要添加更多行。
  • writer.close();?在 for 循环之外。
  • 谢谢@SatyaTNV,这是错误。

标签: java csv printwriter


【解决方案1】:

这是您问题的可能解决方案,您可以在这里找到解决方案

public class App {
    public static List<String> listA = new ArrayList<>();
    public static void main(String[] args) {
        matchSplits();
    }
    public static void matchSplits() {
        String header = "Name_DS_1" + "," + "LineString_1" + "," + "UFI_1" + "," + "Name_DS_2" + "," + "LineString_2" + "," + "UFI_2";
        String fileName = "foo.csv"; // your file name here
        File file = new File(fileName);
        try (PrintWriter writer = new PrintWriter(file)) {
            // no need to check if k == 0, this is outside the loop
            listA.add(header);
            // prepare your data here
            for (int k = 0; k < 3; k++) {
                String Name_DS_1 = "Name1";
                String LineString_1 = "Line1";
                String UFI_1 = "Ufi1";
                String Name_DS_2 = "Name2";
                String LineString_2 = "Line2";
                String UFI_2 = "Ufi2";
                String line = Name_DS_1 + "," + LineString_1 + "," + UFI_1 + "," + Name_DS_2 + "," + LineString_2 + "," + UFI_2;
                listA.add(line);
            }
            // write your lines here
            for (String s: listA) {
                writer.println(s);
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }
}

一些提示:

  • 无需像您在try(...) 中声明的那样关闭PrintWriter
  • 不需要\r\n,因为您已经在使用printline
  • 不需要两个计数器,k就足够了(至少在这个sn-p中)

【讨论】:

    【解决方案2】:

    发生这种情况是因为您在 for 循环的范围内编写了 writer.close()。 for (int k=0;k

    尝试删除 writer.close() 语句。 由于此语句仅在 k=0 时关闭写入过程。

    由于 PrintWriter 实例是在 try-with-resource 语句中声明的,如果这些资源实现 AutoCloseable 接口,则无论 try 语句正常完成还是突然完成都会关闭它。

    尝试这样做,希望它能解决您的问题:)

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2014-09-19
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多