Java читает файл CSV, содержимое не записывается в новый файл CSV

package com;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import com.opencsv.CSVWriter;
import com.opencsv.CSVReader;

public class Sample2 {
    public static void main(String args[]) throws IOException
    {
        CSVReader csvReader = null;  
        String[] employeeDetails ;        
        CSVWriter  csvWriter = new CSVWriter(new FileWriter("D:\\sample\\myfile.csv",true));
        csvReader = new CSVReader(new FileReader("D:\\sample\\source.csv"));          
        try
        {        

            employeeDetails = csvReader.readNext();               
            while ((employeeDetails = csvReader.readNext()) != null ) {               

                    System.out.println(Arrays.toString(employeeDetails));                   
                    csvWriter.writeNext(employeeDetails);
                }               

        }catch(Exception ee)
            {
                ee.printStackTrace();
            }
        }
}

У меня есть приведенный выше код Java. Он считывает данные из файла source.csv, а также отображает их в консоли. Он создал myfile.csv, но то же самое содержимое, которое он не записал в файл csv. Кто-нибудь знает об этом


person uservba12    schedule 23.01.2019    source источник
comment
Вы пытались закрыть FileWriter и CsvWriter? Попробуйте использовать ресурсы try-with   -  person Stephan Hogenboom    schedule 23.01.2019
comment
Не уверен, но, возможно, вам придется очистить и закрыть писатель   -  person Evgeni Enchev    schedule 23.01.2019


Ответы (2)


Проблема в том, что вы не закрываете свои выходные ресурсы, попробуйте этот код:

public static void main(String args[]) throws IOException {
String[] employeeDetails;

try (CSVWriter csvWriter = new CSVWriter(new FileWriter("D:\\sample\\myfile.csv", true));
    CSVReader csvReader = new CSVReader(new FileReader("D:\\sample\\source.csv"));
    ) {

  while ((employeeDetails = csvReader.readNext()) != null) {

    System.out.println(Arrays.toString(employeeDetails));
    csvWriter.writeNext(employeeDetails);
  }
}
catch (Exception ee) {
  ee.printStackTrace(); //perhaps you should also log the error?
}
}

Также взгляните на этот вопрос Всегда ли важно закрытие ресурсов?

person Stephan Hogenboom    schedule 23.01.2019

CSVWriter реализует Flushable.Working Solution уже присутствует в ответе @Stephan Hogenboom. отвечу почему не написал в вашем случае,

Из javadocs интерфейса Flushable,

Flushable — это место назначения данных, которые можно сбросить. Метод flush вызывается для записи любого буферизованного вывода в базовый поток.

По соображениям производительности все данные следует временно записывать в буфер, а не в файл. Как только вы вызываете метод flush(), он сбрасывает данные, уже имеющиеся в буфере, в ваш файл (именно здесь происходит дисковый ввод-вывод, не при вызове writeNext() ).

Как упоминалось в документе flush() в java.io.Writer.

Сбрасывает поток. Если поток сохранил какие-либо символы из различных методов write() в буфере, немедленно запишите их в предполагаемое место назначения.

person Mohamed Anees A    schedule 23.01.2019
comment
Хорошее объяснение! - person Stephan Hogenboom; 23.01.2019
comment
Спасибо @StephanHogenboom :) - person Mohamed Anees A; 23.01.2019
comment
Я должен сказать, что в javadocs есть ответы на все вопросы, если только мы умеем правильно их читать! :П - person Mohamed Anees A; 23.01.2019