В моей программе мне нужно перезаписать текущие данные в файл CSV. Но после перезаписи, когда я снова запускаю свою программу, эти данные исчезли.
> public class writeFile {
private Writer fw;
public writeFile(String fileName) {
try {
fw = new FileWriter(fileName, false);
} catch (IOException e) {
System.out.println(e.toString());
}
}
public void writeToCSV(String[] org) {
String text = "";
for(int i = 0; i < org.length; i++) {
text += org[i];
if (i != org.length - 1) {
text += ",";
} else {
text += "\n";
}
}
try {
fw.write(text);
fw.flush();
//fw.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}
public void shutDown() {
try {
fw.close();
} catch(IOException e) {
System.out.println(e.toString());
}
}
}
Выше мой класс writeFile. Может ли кто-нибудь помочь мне объяснить и исправить это?
Где вы вызываете метод writeToCSV()
?
Привет всемогущий, добро пожаловать, вам нужно только изменить fw = new FileWriter(fileName, false); to fw = new FileWriter( fileName, true ); и каждая запись будет агрегировать данные, а не перезаписывать их.
Я предполагаю, что вы имеете в виду «мой файл пуст». Поскольку вы открываете Writer
без добавления, я предполагаю, что вы знаете, что все предыдущее будет перезаписано.
Просто чтобы устранить любую путаницу: Создает FileWriter с учетом файла для записи и логического значения, указывающего, следует ли добавлять записанные данные, используя кодировку по умолчанию.
Если вы решили заняться домашним пивоварением, то, возможно: 1. Сделайте название класса существительным, например. CsvWriter
2: реализовать AutoCloseable
3: не объединять String
, писать поля прямо 4: сбросить после разделителя строк 5: использовать Files.newBufferedWriter
, чтобы получить Writer
@rzwitserloot, вы можете зайти на веб-сайт Oracle и прочитать FileWriter public FileWriter(String fileName, boolean Append) выдает IOException Создает объект FileWriter по имени файла с логическим значением, указывающим, следует ли добавлять записанные данные . ;)
Я запутал своих конструкторов. Комментарий отозван, @MarcePuente
@rzwitserloot, Только великие люди признают свои ошибки, я рад, что ты являешься частью сайта.
всем спасибо, я решил свои проблемы.
append
Проблема возникает из-за второго аргумента конструктора FileWriter
.
Этот конструктор создает FileWriter
, используя указанное имя файла и логическое значение, указывающее, следует ли добавлять данные в файл. Используется кодировка по умолчанию.
Параметры:
fileName
: String
, представляющий системно-зависимое имя файла.append
: boolean
, который, если установлен в true
, будет записывать данные в конец файла, а не в начало.См. Javadoc для конструкторов:
это полезно, я понял свою ошибку и решил ее. Большое спасибо!
Ответ Резаи правильный. Кроме того, я автоматически закрывал файл при каждом использовании. Нет смысла держать файл открытым.
Класс FileWriter реализует AutoCloseable. Это означает, что мы можем использовать синтаксис try-with-resources для автоматического закрытия.
В соответствии с соглашением Java начинайте имя класса с заглавной буквы. И выберите более конкретное описательное имя, например CsvWriter
.
Как правило, лучше всего делать ваши конструкторы максимально короткими, простыми и понятными. Если вам нужно перехватывать исключения, рассмотрите другой дизайн.
Лучше явно указать предполагаемую кодировку символов, чем неявно полагаться на значение по умолчанию. Позже сообщите о своих намерениях программистам, читающим ваш код. Так что используйте этот конструктор.
public class CsvWriter {
// Fields
private String fileName ;
// Constructor
public CsvWriter( final String aFileName ) {
this.fileName = aFileName ;
}
// Behavior
public void write ( final String[] input ) {
try
(
FileWriter writer = new FileWriter( this.fileName , StandardCharsets.UTF_8 , true ) ; // `true` to append to file rather than replace.
)
{
// write your CSV, call methods on `writer` variable.
}
catch ( … ) { … }
// The file writer is automatically closed at this point.
}
}
Использование:
CsvWriter csvWriter = new CsvWriter( … ) ;
csvWriter.write( … ) ;
…
csvWriter.write( … ) ;
В этом коде предполагается, что вы работаете в однопоточном режиме. Этот код не является потокобезопасным.
Конечно, в реальной работе вы бы использовали одну из хороших библиотек CSV, а не создавали бы свои собственные.
shutDown
почти наверняка не вызывается надежно. Кстати, что вы собираетесь делать, если один из элементов вашего массива содержит одну или несколько запятых? Вам следует использовать подходящий модуль записи CSV. кстати, названия классов должны быть на основе существительных