it-roy-ru.com

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

Я попытался записать вывод консоли в текстовый файл, используя это предложение кода ( 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");
   }
58
Jessy

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

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

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

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

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

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 . Они предлагают детальное управление журналированием через файлы конфигурации времени выполнения, поддержку прокручиваемых файлов журналов, каналы в системном журнале и т.д.

В качестве альтернативы, если вы не «ведете журнал», подумайте:

  • перенаправить стандартный вывод в файл в командной строке, или
  • изменение вашего приложения для использования потока out, переданного в качестве параметра, а не записи в System.out.

Изменение System.out может вызвать неприятные сюрпризы для другого кода в вашей JVM, который не ожидает, что это произойдет.

113
Stephen C

Нет необходимости писать код, просто в cmd На консоли вы можете написать:

javac myFile.Java
java ClassName > a.txt

Выходные данные хранятся в файле .txt.

27
ali ahmad

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

    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);
        }
    }

и используется как в: 

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

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

21
Carlos Heuberger

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

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 и многие другие

10
Bozho

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

7
trashgod

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

4
ZoogieZork

Это моя идея о том, что вы пытаетесь сделать, и это прекрасно работает:

public static void main(String[] args) throws IOException{

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    BufferedWriter out = new BufferedWriter(new FileWriter("c://output.txt"));
    try {
        String inputLine = null;
        do {
            inputLine=in.readLine();
            out.write(inputLine);
            out.newLine();
        } while (!inputLine.equalsIgnoreCase("eof"));
        System.out.print("Write Successful");
    } catch(IOException e1) {
        System.out.println("Error during reading/writing");
    } finally {
        out.close();
        in.close();
    }
}
3
Abhiyank

Самый простой способ записать вывод консоли в текстовый файл - 

//create a file first    
    PrintWriter outputfile = new PrintWriter(filename);
//replace your System.out.print("your output");
    outputfile.print("your output");
    outputfile.close(); 
1
Prakash Kandel
PrintWriter out = null;
try {
    out = new PrintWriter(new FileWriter("C:\\testing.txt"));
    } catch (IOException e) {
            e.printStackTrace();
    }
out.println("output");
out.close();

Я использую абсолютный путь для FileWriter. Это работает для меня как шарм. Также убедитесь, что файл присутствует в месте. В противном случае будет выдано исключение FileNotFoundException. Этот метод не создает новый файл в целевом местоположении, если файл не найден.

0
dhayanand baskar

Чтобы записать вывод консоли в текстовый файл

public static void main(String[] args) {
    int i;
    List<String> ls = new ArrayList<String>();
    for (i = 1; i <= 100; i++) {
        String str = null;
        str = +i + ":-  HOW TO WRITE A CONSOLE OUTPUT IN A TEXT FILE";
        ls.add(str);
    }
    String listString = "";
    for (String s : ls) {
        listString += s + "\n";
    }
    FileWriter writer = null;
    try {
        writer = new FileWriter("final.txt");
        writer.write(listString);
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

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

<dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.0.6</version>
</dependency>

Чтобы создать PDF, используйте этот код:

public static void main(String[] args) {
    int i;
    List<String> ls = new ArrayList<String>();
    for (i = 1; i <= 100; i++) {
        String str = null;
        str = +i + ":- HOW TO WRITE A CONSOLE OUTPUT IN A PDF";
        ls.add(str);
    }
    String listString = "";

    for (String s : ls) {
        listString += s + "\n";
    }
    Document document = new Document();
    try {
        PdfWriter writer1 = PdfWriter
                .getInstance(
                        document,
                        new FileOutputStream(
                                "final_pdf.pdf"));
        document.open();
        document.add(new Paragraph(listString));
        document.close();
        writer1.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (DocumentException e) {
        e.printStackTrace();
    }
}
0
Ashish Vishnoi