Показать стандартный вывод в файле и в консоли (с помощью System.setOut (новый PrintStream (новый файл ("output-file.txt")) - PullRequest
0 голосов
/ 10 января 2019

Я хочу сохранить стандартный вывод в файл. Для этого я использовал
System.setOut(new PrintStream(new File("output-file.txt")));

Теперь в консоли нет вывода.

        try {
            System.setOut(new PrintStream(new File("output-file.txt")));
        } catch (Exception e) {
             e.printStackTrace();
        }

Есть ли возможность показать стандартный вывод в консоли, хотя я использую стандартный вывод для заполнения файла?

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Вы можете создать новый подкласс класса PrintStream, а затем переопределить его методы для записи во второй поток, а затем передать его в System.out, как вы уже один. Дальнейшее чтение и пример реализации: https://books.google.ch/books?id=lbnjAwAAQBAJ&lpg=PA326&ots=j7OUeuXzIa&dq=java%20duplicate%20printstream&pg=PA326#v=onepage&q=java%20duplicate%20printstream&f=false

0 голосов
/ 10 января 2019

Нельзя использовать системы OutputStream для записи в 2 источника. Это статическая переменная, и она может иметь только 1 значение за раз.

Однако вы можете попробовать сохранить ссылку на консоль по умолчанию OutputStream, а затем изменить системы OutputStream в свой пользовательский поток вывода и записать в обе из них пользовательский метод.

0 голосов
/ 10 января 2019

Вы можете создать PrintWriter с OutputStream, который выполняет обе записи.

final OutputStream stdOut = System.out;
try {
    System.setOut(new PrintStream(new OutputStream() {
        private PrintStream ps = new PrintStream(new File("output-file.txt"));

        @Override
        public void write(int b) throws IOException {
            ps.write(b);
            stdOut.write(b);
        }

        @Override
        public void flush() throws IOException {
            super.flush();
            ps.flush();
            stdOut.flush();
        }

        @Override
        public void close() throws IOException {
            super.close();
            ps.close();
            // stdOut.close(); // Normally not done
        }
    }));
} catch (Exception e) {
    e.printStackTrace();
}

System.out.println("Hello, world!");
0 голосов
/ 10 января 2019

Я никогда не пробовал, но, думаю, если вы подкласса Printstream по умолчанию, вы сможете печатать на консоли и в файл самостоятельно.

Что-то вроде:

class MyPrintStream extends printStream {

    private PrintStream secondPrinter;

    .....

    @Override 
    public void println(Object content) {
       super.println(content);
       secondPrinter.println(content);
    }
}

и, возможно, назовите это так:

System.out = new MyPrintStream(myFile, System.out);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...