Программа не завершается полностью

#java #filewriter #printwriter

#java #filewriter #printwriter

Вопрос:

Я пытаюсь создать программу, которая принимает входной файл, содержащий строки целых чисел, указывающие количество пробелов и, поочередно, символы, которые должны быть напечатаны для создания рисунка. Первым целым числом в строке всегда будет количество пробелов для печати (это может быть 0). Каждое альтернативное целое число будет состоять из нескольких символов для печати. Последнее целое число в строке всегда будет равно -1, отмечая конец строки. Например, строка 0 2 4 2 -1 будет представлять «0 пробелов — 2 символа — 4 пробела — 2 символа — следующая строка». Символы могут быть любыми, такими как «#» или «%»

Это то, что у меня есть на данный момент…

 import java.io.*;
import java.util.Scanner;

public class PicturePrinter
{
private Scanner fileScanner;
private FileWriter fwriter;
private PrintWriter outputFile;

public PicturePrinter(File file, boolean appendToOutputFile) throws IOException
{
    fileScanner = new Scanner(file);
    if (appendToOutputFile)
    {
        fwriter = new FileWriter("output.txt", true);
        outputFile = new PrintWriter(fwriter);
        printPicture(true);
        outputFile.close();
    }
    else
    {
        printPicture(false);
    }
    fileScanner.close();
}

//***************

public static void main(String[] args) throws IOException
{
    String infileName;
    Scanner keyboard =  new Scanner(System.in);
    boolean badFile;
    File file;
    System.out.println("This program prints pictures from input files.");
    System.out.println("Do you need a picture printed? (y or n): ");
    String answer = keyboard.nextLine();
    while (answer.charAt(0) == 'y' || answer.charAt(0) == 'Y')
    {
        do
        {
            System.out.print("Enter your input file's name: ");
            infileName = keyboard.nextLine();
            file = new File(infileName);
            if (!file.exists())
            {
                badFile = true;
                System.out.println("That file does not exist.");
            }
            else
            {
                badFile = false;
            }
        }
        while (badFile);
        System.out.print("Would you like to export the picture to output.txt? (y or n): ");
        answer = keyboard.nextLine();
        if (answer.charAt(0) == 'y' || answer.charAt(0) == 'Y')
        {
            PicturePrinter pp = new PicturePrinter(file, true);
        }
        else
        {
            PicturePrinter pp = new PicturePrinter(file, false);
        }
        System.out.print("Would you like another picture printed? (y or n): ");
        answer = keyboard.nextLine();
    }
}

public static void printPicture(boolean picture)
{
    Scanner key =  new Scanner(System.in);
    while (key.hasNextLine())
        {
            if (key.hasNextInt() amp;amp; key.nextInt() != -1)
            {
                int space = key.nextInt();
                System.out.format("[%spaces]%n", "");
                int chars = key.nextInt();
                System.out.format("[%charss]%n", "#");
            }
            else
            {
                System.out.println();
            }
       }
  }
 }
  

Все компилируется нормально, но когда я запускаю программу, она становится пустой после получения ответа на экспорт изображения. Просто ничего не делает после этого. Я думаю, что это метод printPicture в нижней части кода, который все портит. Я просто не знаю, что делать, чтобы это исправить.

входные файлы выглядят следующим образом

 4 3 3 -1
2 4 1 1 2 -1
1 1 1 1 1 2 1 1 1 -1
0 3 2 1 1 3 -1
5 1 4 -1
2 3 1 3 1 -1
1 5 1 3 -1
1 3 1 1 1 1 1 1 -1
1 5 1 3 -1
2 3 1 3 1 -1
  

Комментарии:

1. новый сканер (System.in ); — вы хотите распечатать пользовательский ввод?

2. да. что должен делать ваш printPicture метод? Как вы думаете, почему это «все портит»?

Ответ №1:

hasNextLine() и hasNextInt() являются блокирующими методами, которые ожидают ввода. Предполагается, что вы предоставляете входные данные из файла, но вместо этого вы устанавливаете для сканера значение Scanner key = new Scanner(System.in); в методе printPicture() — вот почему метод зависает навсегда.

Ответ №2:

printPicture Метод должен считывать данные из файла, а не из стандартного ввода. Другими словами, вы используете неправильный сканер в printPicture . Удалите key сканер и используйте fileScanner вместо него.