У меня возникли проблемы с написанием кода для записи нескольких строк в файл CSV. Когда я открываю файл CSV, отображается только последний ввод пользователя, а все предыдущие вводы — нет.
Я также не могу разместить заголовки в верхней части файла, чтобы отображать «Имя, время».
import java.util.*;
import java.io.*;
public class programOneTest
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String choice;
do
{
String fileName = "storage.csv";
String name = getName(sc);
double time = getTime(sc);
writeToFile(fileName, name, time);
System.out.println("Would you like to enter more data? (Y/N)");
choice = sc.nextLine();
} while ("y".equalsIgnoreCase(choice));
}
private static String getName(Scanner sc)
{
String name;
do
{
System.out.println("Name:");
name = sc.nextLine();
if (name.isEmpty())
{
System.out.println("Error. Please enter a name.");
}
} while (name.isEmpty());
return name;
}
private static double getTime(Scanner sc)
{
double time = -1.0;
do
{
System.out.println("Time:");
time = sc.nextDouble();
sc.nextLine();
if (time > 0)
{
break;
}
else
{
System.out.println("Error. Please enter an appropriate time.");
}
} while (time < 0);
return time;
}
private static void writeToFile(String pFileName, String pName, double pTime)
{
FileOutputStream fileStrm = null;
PrintWriter pw;
try
{
fileStrm = new FileOutputStream(pFileName);
pw = new PrintWriter(fileStrm);
pw.println("Name , Time"); //Apparently i cannot do this as it causes errors?
pw.println(pName + "," + pTime);
pw.close();
}
catch(IOException e)
{
System.out.println("Error in writing to file: " + e.getMessage());
}
}
}
Вывод в программе:
Name:
John
Time:
6
Would you like to enter more data? (Y/N)
Y
Name:
Van
Time:
4
Что показано в CSV-файле:
Van, 4
Что я хочу показать в CSV-файле:
Name, Time
John, 6
Van, 4
Также убедитесь, что все ваши данные прочитаны: stackoverflow.com/questions/13102045/…
проверьте документацию конструктора с двумя аргументами FileOutputStream
Спасибо, ребята, за помощь, не знал, что документация существует.




Вы должны открыть файл с флагом добавления «true».
fileStrm = new FileOutputStream(pFileName, true);
Ссылка на документацию
Огромное спасибо, омг, я не знал, что документация существует
Когда вы создаете новый PrintWriter, он создает новый пустой файл. Вот почему в вашем файле сохраняется только последняя запись. Я предлагаю использовать NIO.2, который доступен начиная с Java 7 (выпущенной в 2011 году). Следующий код демонстрирует.
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.InputMismatchException;
import java.util.Scanner;
public class ProgTest {
private static String getName(Scanner sc) {
String name;
do {
System.out.print("Name: ");
name = sc.nextLine();
if (name.isEmpty()) {
System.out.println("You did not enter a name.");
}
} while (name.isEmpty());
return name;
}
private static double getTime(Scanner sc) {
double time;
do {
System.out.print("Time: ");
try {
time = sc.nextDouble();
}
catch (InputMismatchException xInput) {
time = 0.0;
}
if (time <= 0.0) {
System.out.println("Enter a positive number (which may include a decimal fraction).");
}
sc.nextLine();
} while (time <= 0);
return time;
}
private static void writeToFile(BufferedWriter bw, String line) throws IOException {
bw.write(line);
bw.newLine();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String choice;
Path path = Paths.get("storage.csv");
try (BufferedWriter bw = Files.newBufferedWriter(path,
StandardOpenOption.CREATE,
StandardOpenOption.APPEND,
StandardOpenOption.WRITE)) {
writeToFile(bw, "Name,Time");
do {
String name = getName(sc);
double time = getTime(sc);
writeToFile(bw, name + "," + time);
System.out.print("Enter more data? (y/n): ");
choice = sc.nextLine();
} while ("y".equalsIgnoreCase(choice));
}
catch (IOException xIo) {
xIo.printStackTrace();
}
}
}
Отвечает ли это на ваш вопрос? Как записать данные с помощью FileOutputStream, не теряя старые данные?