Как записать консольный вывод в txt файл

Я попытался записать консольный вывод в txt файл с помощью этого предложения кода (http://www.daniweb.com/forums/thread23883.html#) однако, я не был успешен. Что случилось?

try {
      //create a buffered reader that connects to the console, we use it so we can read lines
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

      //read a line from the console
      String lineFromInput = in.readLine();

      //create an print writer for writing to a file
      PrintWriter out = new PrintWriter(new FileWriter("output.txt"));

      //output to the file a line
      out.println(lineFromInput);

      //close the file (VERY IMPORTANT!)
      out.close();
   }
      catch(IOException e1) {
        System.out.println("Error during reading/writing");
   }

62
задан Dropout 29 May 2013 в 18:17
поделиться

5 ответов

Нужно сделать что-то вроде этого:

PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);

Второе утверждение - это ключ. Оно изменяет значение якобы "конечного" атрибута System.out на поставляемое значение PrintStream.

Существуют аналогичные методы (setIn и setErr) для изменения стандартных потоков входных данных и потоков ошибок; подробнее см. javadocs java.lang.System.

Более общая версия вышесказанного:

PrintStream out = new PrintStream(
        new FileOutputStream("output.txt", append), autoFlush);
System.setOut(out);

Если append равен true, то поток будет добавлен к существующему файлу вместо его усечения. Если autoflush равен true, то при записи массива байтов выходной буфер будет очищен, будет вызван один из методов println, или будет записан \n.


Хотелось бы добавить, что обычно лучше использовать подсистему протоколирования, такую как Log4j, Logback или стандартную подсистему Java java.util.logging. Они обеспечивают точное управление протоколированием через конфигурационные файлы во время выполнения, поддержку скатывания лог-файлов, подачу данных в системную регистрацию и т.д.

Альтернативно, если вы не "протоколируете", рассмотрим следующее:

  • В обычных оболочках вы можете перенаправить стандартный вывод (или стандартную ошибку) в файл в командной строке; например,

    $ java MyApp > output.txt 
    

    Дополнительную информацию см. в руководстве по эксплуатации или записи вручную.

  • Можно изменить приложение, чтобы оно использовало поток out, переданный в качестве параметра метода или через одноэлементный ввод или ввод зависимостей, вместо записи в System.out.

Изменение System.out может привести к неприятным сюрпризам для другого кода в вашем JVM, который не ожидает этого. (Правильно спроектированная Java-библиотека позволит избежать зависимости от System.out и System.err, но вам может не повезти)

.
117
ответ дан 24 November 2019 в 16:33
поделиться

чтобы сохранить консольный вывод, то есть записать в файл, а также чтобы он отображался на консоли, можно использовать класс типа:

    public class TeePrintStream extends PrintStream {
        private final PrintStream second;

        public TeePrintStream(OutputStream main, PrintStream second) {
            super(main);
            this.second = second;
        }

        /**
         * Closes the main stream. 
         * The second stream is just flushed but <b>not</b> closed.
         * @see java.io.PrintStream#close()
         */
        @Override
        public void close() {
            // just for documentation
            super.close();
        }

        @Override
        public void flush() {
            super.flush();
            second.flush();
        }

        @Override
        public void write(byte[] buf, int off, int len) {
            super.write(buf, off, len);
            second.write(buf, off, len);
        }

        @Override
        public void write(int b) {
            super.write(b);
            second.write(b);
        }

        @Override
        public void write(byte[] b) throws IOException {
            super.write(b);
            second.write(b);
        }
    }

и использовать как in:

    FileOutputStream file = new FileOutputStream("test.txt");
    TeePrintStream tee = new TeePrintStream(file, System.out);
    System.setOut(tee);

( просто идея, а не полная)

.
23
ответ дан 24 November 2019 в 16:33
поделиться

В дополнение к нескольким обсуждаемым программным подходам, другой вариант - перенаправление стандартного вывода из оболочки. Вот несколько примеров Unix и DOS.

.
7
ответ дан 24 November 2019 в 16:33
поделиться

Вы можете использовать System.setOut() в начале программы, чтобы перенаправить все выходные данные через System.out на ваш собственный PrintStream.

.
4
ответ дан 24 November 2019 в 16:33
поделиться

Создайте следующий метод:

public class Logger {
    public static void log(String message) { 
      PrintWriter out = new PrintWriter(new FileWriter("output.txt", true), true);
      out.write(message);
      out.close();
    }
}

(Я не включил правильную обработку IO в вышеприведенный класс, и он не будет компилировать - сделайте это сами. Также подумайте о настройке имени файла. Обратите внимание на аргумент "true". Это означает, что файл не будет воссоздаваться каждый раз при вызове метода)

Затем вместо System.out.println(str) вызывать Logger.log(str)

Этот ручной подход не является предпочтительным. Используйте фреймворк протоколирования - slf4j, log4j, commons-logging, и многие другие

.
11
ответ дан 24 November 2019 в 16:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: