Использование printwriter для создания текстового файла с несколькими строками из списка - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь создать разделенный запятыми файл в текстовом формате и с помощью try и catch.Для этого я использую библиотеку PrintWriter.Однако я не смог напечатать все строки друг за другом.Я создал список для хранения каждой строки, которую я создаю в каждой итерации, а затем попытался использовать для списка поверх для печати каждого элемента в виде строки в файле:

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());
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Это возможное решение вашей проблемы, здесь вы можете найти решение

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());
        }
    }
}

Несколько советов:

  • Нет необходимости закрывать PrintWriter, как вы объявили его в try(...)
  • Нет необходимости в \r\n, поскольку вы уже используете printline
  • Нет необходимости в двух счетчиках, достаточно k (по крайней мере, в этом фрагменте)
0 голосов
/ 03 мая 2019

Это происходит потому, что вы написали writer.close () в цикле for.for (int k = 0; k <3; k ++) </p>

Попробуйте удалить оператор writer.close ().Поскольку это утверждение закрывает процесс записи, только когда k = 0.

Поскольку экземпляр PrintWriter объявлен в операторе try-with-resource, он будет закрыт независимо от того, завершается ли оператор try нормально или внезапно, если эти ресурсы реализуют интерфейс AutoCloseable.

Попробуйте сделать это, надеюсь, это решит вашу проблему:)

...