Печать результатов выполненной программы (на консоли) в текстовый файл? - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в Java, поэтому извиняюсь, если что-то из этого неясно - я хочу распечатать то, что на консоли, также в текстовый файл - однако я хочу, чтобы он печатался только в конце файла - так в основном он будет проходить через все программы (это игра в угадайку), а затем, после завершения, попросит пользователя ввести имя файла и затем напечатать то, что находится на консоли, в этот файл. Я немного знаком с PrintWriter и BufferedWriter и т. Д., Но я не уверен, что делать, когда я хочу распечатать результаты, которые существуют на консоли, например, ниже (где вопросы system.out.print и цифры 3, 18 19 - пользовательский ввод). Любая помощь будет высоко ценится!

Пожалуйста, угадайте число от 1 до 20: 3

Слишком низко, попробуйте еще раз. Пожалуйста, угадать число от 1 до 20: 18

Слишком низко, попробуйте еще раз. Пожалуйста, угадайте число от 1 до 20: 19

Отлично!

    System.out.println("Enter a file name: ");
    String fileName = Keyboard.readInput();

    File myFile = new File(fileName);

    try (PrintWriter pw = new PrintWriter(new FileWriter(fileName))) {
        pw.write(??????);
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Если вы хотите создать систему, позволяющую использовать System.out для печати на консоль при одновременной печати в файл, вы можете создать оболочку для PrintStream, чтобы она также записывала в файл. Это можно сделать так:

public void setupLogger() {
    PrintStream stream=System.out;
    try {
        File file=new File(System.getProperty("user.dir")+"/log.txt");
        file.delete();
        file.createNewFile();
        System.setOut(new WrapperPrintStream(stream,file));
    } catch (IOException e) {
        e.printStackTrace();
    }

    for (int i = 0; i <100 ; i++) {
        System.out.println("Log test "+i);
    }


}
class WrapperPrintStream extends PrintStream{

    private PrintStream defaultOutput;

    public WrapperPrintStream(@NotNull PrintStream out, File file) throws FileNotFoundException {
        super(new PrintStream(new FileOutputStream(file),true), true);
        defaultOutput =out;

    }

    @Override
    public void println(String x) {
        super.println(x);
        defaultOutput.println(x);
    }

    @Override
    public void println() {
        super.println();
        defaultOutput.println();
    }
    //etc for all methods.
}

Однако я рекомендую использовать такой API, как Log4J , который делает все это автоматически.

0 голосов
/ 06 сентября 2018

Сначала я не очень хорошо понял вопрос, но теперь я понимаю, что понимаю. В моей демонстрации используются методы ввода и вывода, аналогичные тому, что GurpusMaximus показал в своем ответе (+1 к нему), но я использую разные методы для получения ввода и записи вывода.

Вот пример демонстрации:

BufferedReader inputStream = null;
PrintWriter outputStream = null;
String writeString = "";

public void testMethod() {

    File file = new File("text.txt");

    try {
        inputStream = new BufferedReader(new InputStreamReader(System.in));
        outputStream = new PrintWriter(file);

        // Example console text
        println("Enter some text: ");
        String str = read();
        println("Entered: "+str);

        // Do this when you are done with the console and want to write to the file
        outputStream.print(writeString);
        inputStream.close();
        outputStream.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

// Custom print method that also saves what was printed
public void println(String str) {
    System.out.println(str);
    writeString += str + System.lineSeparator(); // You can use the line separator call
                                                 // to format the text on different lines in
                                                 // the file, if you want that
}

// Custom read method that gets user input and also saves it
public String read() {
    try {
        String str = inputStream.readLine();
        writeString += str + System.lineSeparator();
        return str;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

Дайте мне знать, если это больше связано с тем, что вы ищете.

0 голосов
/ 06 сентября 2018

Комментарии были добавлены для разъяснения по функциональности

package com.so.test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {

    //Declare StringBuilder as global.
    private static StringBuilder systemOut = new StringBuilder();

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //Instead of writing only to System.out only also write to a StringBuilder
        writeLnToStreams("Hello!");
        //Attempt to write to File
        try {
            FileOutputStream outputStream = new FileOutputStream(scanner.nextLine());
            outputStream.write(systemOut.toString().getBytes());
        } catch (IOException e) {
            //Will write only to System.err
            e.printStackTrace();
        }
    }

    /**
     *
     * @param output the output to write to System.out and the global StringBuilder
     */
    private static void writeToStreams(String output) {
        System.out.println(output);
        systemOut.append(output);
    }

    /**
     *
     * @param output the output to write to System.out and the global StringBuilder
     */
    private static void writeLnToStreams(String output) {
        System.out.println(output);
        systemOut.append(output).append("\n");
    }
}
...