(Java) В файл записывается только последний ввод, предыдущие вводы игнорируются

У меня возникли проблемы с написанием кода для записи нескольких строк в файл 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

Отвечает ли это на ваш вопрос? Как записать данные с помощью FileOutputStream, не теряя старые данные?

001 29.04.2024 14:22

Также убедитесь, что все ваши данные прочитаны: stackoverflow.com/questions/13102045/…

Stultuske 29.04.2024 14:23

проверьте документацию конструктора с двумя аргументами FileOutputStream

user85421 29.04.2024 14:25

Спасибо, ребята, за помощь, не знал, что документация существует.

natadecoco 30.04.2024 02:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны открыть файл с флагом добавления «true».

fileStrm = new FileOutputStream(pFileName, true);

Ссылка на документацию

Огромное спасибо, омг, я не знал, что документация существует

natadecoco 30.04.2024 02:54

Когда вы создаете новый 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();
        }
    }
}

Другие вопросы по теме