Wczytywanie danych od użytkonika

0

Hej, tworzę program, który między innymi ma wczytywać dane od użytkownika.

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class NewTask {

    public void createTask() {
        System.out.println("Wprowadź treść zadania (zakończ wprowadzanie używając 'Ctrl+D' na Unix/Linux/Mac lub 'Ctrl+Z' na Windows):");

        StringBuilder contentBuilder = new StringBuilder();

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            String line;
            while ((line = reader.readLine()) != null) {
                contentBuilder.append(line).append(System.lineSeparator());
            }
        } catch (IOException e) {
            System.out.println("Błąd przy odczycie danych: " + e.getMessage());
        }


        Scanner scanner = new Scanner(System.in);

        String content = contentBuilder.toString();

        Task task = new Task(content);

        String fileName = addNameOfFile(scanner);

        saveTaskToFile(task, fileName + ".txt");
    }

    private String addNameOfFile(Scanner scanner) {
        System.out.print("Podaj nazwę pliku do zapisania (bez rozszerzenia .txt): ");
        String nameOfFile = scanner.next();
        return nameOfFile;
    }

    private void saveTaskToFile(Task task, String filename) {
        try (FileWriter writer = new FileWriter(filename)) {
            writer.write(task.getContent());
            System.out.println("Zadanie zapisane do pliku: " + filename);
        } catch (IOException e) {
            System.out.println("Błąd przy zapisywaniu zadania: " + e.getMessage());
        }
    }
}

Po wprowadzaniu treści zadania i wciśnięciu ctrl+d nie mogę podać nazwy pliku, od razu rzucany jest wyjątek.

Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:945)
	at java.base/java.util.Scanner.next(Scanner.java:1486)
	at NewTask.addNameOfFile(NewTask.java:37)
	at NewTask.createTask(NewTask.java:30)
	at TaskEditorManager.run(TaskEditorManager.java:26)
	at MainManager.run(MainManager.java:26)
	at Main.main(Main.java:6)

Ktoś wie co robię nie tak?

0

Nie chcę mi się szukać błędu, ale masz to wszytsko strasznie skomplikowane. Odczyt linii tekstu z wejścia w Javie można zrobić dużo prościej - zobacz poniższy przykład.

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

public class PrzykladWejscia {
        /* Obiekt niezbędny do odczytu linii */
        private static BufferedReader czytnik;

        public static void main (String[] args)
        /* Pamiętaj o zadeklarowaniu możliwości
           wystąpienia wyjątku IOException */
        throws IOException {
                String imie;

                /* Inicjalizacja */
                czytnik = new BufferedReader (
                  new InputStreamReader (System.in));

                System.out.print ("Jak masz na imie? ");
                imie = czytnik.readLine (); /* Odczyt linii z wejścia
                                               do String-a */
                System.out.println ("Czesc, " + imie + "!");

                /* Zamknięcie czytnika */
                czytnik.close ();
        }
}
0

 public Task createTask() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Podaj nazwę pliku do zapisania (bez rozszerzenia .txt): ");
        String nameOfFile = scanner.nextLine();

        System.out.println("Wprowadź treść zadania (zakończ wprowadzanie używając 'Ctrl+D' na Unix/Linux/Mac lub 'Ctrl+Z' na Windows):");

        StringBuilder contentBuilder = new StringBuilder();

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            String line;
            while ((line = reader.readLine()) != null) {
                contentBuilder.append(line).append(System.lineSeparator());
            }
        } catch (IOException e) {
            System.out.println("Błąd przy odczycie danych: " + e.getMessage());
        }

        Task task = new Task(nameOfFile, contentBuilder.toString());

        return task;
    }

Poprawiłem, działa. Wcześniej chyba błąd polegał na tym, że blok try catch zamykał strumień wejścia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.