Запись вывода консоли в файл на Java - PullRequest
0 голосов
/ 30 июня 2011

Итак, мне было интересно, можно ли записать весь вывод консоли в отдельный файл вне Java?Я знаю о методе Printwriter и Filewriter.Однако, по моему опыту, это сработало бы, если бы я использовал их все в одном методе, но я не думаю, что смогу сделать это с помощью кода, который у меня есть сейчас.Ниже приведено то, что у меня есть ...

Java-код

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class XMLTagParser extends DefaultHandler 
{
    private int i;

    public XMLTagParser()
    {
        traverse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items"));
    }

    private static final class SaxHandler extends DefaultHandler 
    {

        private StringBuffer buffer;
        private String heading;
        private boolean inHeading;

        public void startElement(String uri, String localName, String qName, Attributes attrs)
        {
            if ("w:pStyle".equals(qName))
            {
                String val = attrs.getValue("w:val");

                if (val.contains("Heading"))
                {
                    if (isHeading(val))
                    {
                        System.out.println(val);
                        inHeading = true;
                    }
                }
            }

            if("w:t".equals(qName))
            {
                if (inHeading == true)
                {
                    buffer = new StringBuffer();
                }
            } 
        }

        public void characters(char buff[], int offset, int length) throws SAXException
        {
            String s = new String(buff, offset, length);

            if(buffer != null)
            {
                buffer.append(s);
                heading = heading += s;
            }   
        }

        public void endElement(String uri, String localName, String qName)
        {
            buffer = null; 

            //if the qName is "w:p" and it is in the heading, print out the heading and then reset
            if ("w:p".equals(qName) && inHeading == true)
            {       
                System.out.println(heading);        

                heading = "";
                inHeading = false;      
            }   
        }

        // method to verify whether element is an actual heading
        private static boolean isHeading(String heading)
        {
            String headingNumber = heading.substring(7,8);
            String headingName = heading.substring(0,7);

            if (headingName.equals("Heading"))
            {
                if (headingNumber.equals("1") 
                        || headingNumber.equals("2")
                        || headingNumber.equals("3")
                        || headingNumber.equals("4")
                        || headingNumber.equals("5")
                        || headingNumber.equals("6"))
                {
                    return true;
                }
            }

            return false; 
        }
    }

    /*private void writeFile(File file)
    {
        try 
        {
            PrintWriter out = new PrintWriter(new FileWriter(file + "/" + i++));
            out.close();
        } 
        catch (IOException e) 
        {
            e.printStackTrace(System.out);
        }
    }*/

    private void traverse(File directory)
    {
        //Get all files in directory
        File[] files = directory.listFiles();
        for (File file : files)
        {
            if (file.getName().equals("document.xml"))
            {
                try 
                {
                    // creates and returns new instance of SAX-implementation:
                    SAXParserFactory factory = SAXParserFactory.newInstance();

                    // create SAX-parser...
                    SAXParser parser = factory.newSAXParser();

                    // prints out the current working proposal, traversing up the directory structure
                    System.out.println(file.getParentFile().getParentFile().getName());

                    // .. define our handler:
                    SaxHandler handler = new SaxHandler();

                    // and parse:
                    parser.parse(file.getAbsolutePath(), handler);

                    try 
                    {
                        // instantiates new printwriter which writes out to a file
                        PrintWriter out = new PrintWriter(new FileWriter(file.getParentFile().getParentFile() + "/" + i++ + ".txt"));
                        out.close();
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace(System.out);
                    }
                } 
                catch (Exception ex) 
                {
                    ex.printStackTrace(System.out);
                }
            }
            else if (file.isDirectory())
            {
                //It's a directory so (recursively) traverse it
                traverse(file);
            }
        }
    }
}

Так что я создал там экземпляр принтера, но, очевидно, это не хорошо, если у меня ничегонаписать ему.Так что я не совсем уверен, как я могу получить то, что распечатывает консоль, для записи в этот файл.Есть идеи?Заранее спасибо.

Ответы [ 5 ]

6 голосов
/ 30 июня 2011

Если вы действительно хотите, вы можете перенаправить System.out на любой PrintStream, например:

PrintStream stream = new PrintStream("filename.txt");
System.setOut(stream);
6 голосов
/ 30 июня 2011

Если вы займетесь прокруткой своего собственного файлового логгера, вы потратите больше времени на решение проблем ввода-вывода, проката файлов, размеров файлов и т. Д. Вместо этого следует использовать log4j ! Он будет обрабатывать подобные вещи и сделает вашу регистрацию более гибкой.Это в значительной степени стандарт для ведения журналов Java.

2 голосов
/ 30 июня 2011

System.out в основном является OutputStream; который по умолчанию указывает на консоль. Вместо этого вы можете просто создать новый экземпляр FileOutputStream, указывающий на файл по вашему выбору, и идентифицировать этот поток, установив его через System.setOut. Это сделает это за вас на протяжении всего жизненного цикла программы / приложения. Проверьте эту ссылку для полного кода.

1 голос
/ 30 июня 2011

Вы можете продолжать использовать System.out и перенаправлять его с помощью «>» в ​​файл при запуске приложения. Вы все еще можете сохранить stderr для прямого вывода на консоль. Или вы имеете в виду что-то еще, когда пишете "за пределами Java"?

1 голос
/ 30 июня 2011

Вместо использования System.out, вы можете использовать FileWriter, записать в него и очистить его.Непонятно, почему вы увеличиваете i в своем коде.Думаю, вы хотите записать все в один файл.

Кроме того, похоже, что вы никогда не пишете в Writer, который инициализируете.

...