Получение результатов из метода void в выходной файл - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в Java, поэтому спасибо за помощь!

    public static int convert (String value) {
      int temp_convert = 0;
      // Setting up new Scanner to read the User-input string
      Scanner token = new Scanner(value);
      // Take out the word "CONVERT"
      String fnc = token.next();
      // Get the temperature that needs to be converted
      int temp = token.nextInt();
      // Current unit of temperature
      String type = token.next().toLowerCase();
      if (type.equals("f")) {
         temp_convert = (int) Math.round((temp - 32)/1.8); 
         System.out.println(temp_convert + "C");
      } else if (type.equals("c")) {
         temp_convert = (int) Math.round(1.8 * temp + 32);
         System.out.println(temp_convert + "F");
      }
      return temp_convert;
   }

Я пытаюсь получить результат печати этого метода в выходной файл, используя PrintStream. Мне нужно, чтобы все строки, напечатанные в этом методе, были распечатаны в выходной файл. Как я могу это сделать? Это код, который у меня есть, но он пока ничего не генерирует в файле .txt.

public static void readFile (Scanner console, String file_input) throws FileNotFoundException {
      // Setting up new Scanner to scan the file
      Scanner input = new Scanner (file_input);
       // Prompt user for output file's name
      System.out.print("Output file name: ");
      String name_output = console.next();
      PrintStream file_output = new PrintStream(new File(name_output));
      System.out.println("YazLang program interpreted and output to .txt file!");
      System.out.println();
      while (input.hasNext()) {
         String value = input.nextLine().toLowerCase();
         if (value.startsWith("convert")) {
            int concert_temp = convert(value);
            file_output.println(concert_temp);
         } else if (value.startsWith("range")) {
            range(value);
         } else if (value.startsWith("repeat")) {
            repeat(value);
         }
      }
   } 

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

вы можете использовать System.setOut () (https://www.tutorialspoint.com/java/lang/system_setout.htm). Вставьте эту строку после строки 7 в метод readFile:

System.setOut(file_output);
0 голосов
/ 26 февраля 2020

Существует две опции:

  1. Определите PrintStream в самой внешней функции, а затем передайте ее любой функции, которая вам нужна. Продолжить запись в файл, используя метод PrintStream::print....

  2. Определить класс-оболочку, который будет записывать в оба потока:

public class DuplexPrinter {

    private final PrintStream printStream;

    public DuplexPrinter(PrintStream printStream) {
        this.printStream = printStream;
    }

    public void println(String line) {
        System.out.println(line);
        printStream.println(line);
    }

    public void close() {
        printStream.close();;
    }
}

Init принтер:

DuplexPrinter printer = new DuplexPrinter(file_output);

Теперь замените каждый вызов на System.out.println на:

printer.println()
Использование сторонней библиотеки. Например TeeOutputStream
0 голосов
/ 26 февраля 2020

Почему бы вам не изменить сигнатуру метода convert, чтобы он возвращал int?

public static int convert (String value) {
    Scanner token = new Scanner(value);
    // ...
    return value;
}

, а затем записать результат в файл в методе readFile следующим образом:

public static void readFile (Scanner console, String file_input) throws FileNotFoundException {
  // omitted..
  while (input.hasNext()) {
     String value = input.nextLine().toLowerCase();
     if (value.startsWith("convert")) {
        int concert_temp = convert(value);
        file_output.println(concert_temp);
     } else if (value.startsWith("range")) {
        // here
        int concert_temp = range(value);
        file_output.println(concert_temp);
     } else if (value.startsWith("repeat")) {
        repeat(value);
     }
  }
} 
...