2011-06-30 65 views
0

所以我想知道是否可以將所有控制檯輸出寫入Java以外的單獨文件?我知道Printwriter和Filewriter方法。然而,根據我的經驗,如果我在一種方法中使用它們,那麼這些方法就行得通,但我認爲我不能用我現在的代碼來完成這些工作。下面是我...使用Java將控制檯輸出寫入文件

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

所以我實例化的PrintWriter在那裏,但顯然這是沒有好,如果我沒有什麼可寫的。所以我不確定如何讓控制檯打印出來的內容寫入該文件。有任何想法嗎?提前致謝。

+0

我沒有看到你寫什麼實例化'PrintWriter'。 –

+0

@Bala - System.out = PrintStream –

回答

6

如果你真的想你可以重定向System.out任何PrintStream這樣的:

PrintStream stream = new PrintStream("filename.txt"); 
System.setOut(stream); 
+0

感謝大家的意見,但我用@Andreas回答。現在就足夠了,但我覺得我可能不得不在路上改變它,所以我們會看到。不過謝謝。 –

+0

非常有用的把戲。謝謝。 –

6

如果你進入自己的文件記錄器,你會花更多的時間來處理io問題,滾動文件,文件大小等。 您應該改用log4j它將處理這樣的事情,並使您的日誌記錄更加靈活。這幾乎是java日誌記錄的標準。

1

而不是使用System.out,您可以使用FileWriter,寫入並刷新它。目前還不清楚,爲什麼你在代碼中增加i。我想你想把所有東西都寫入一個文件。

此外,它看起來像你永遠不會寫入您初始化的作家。

1

您可以繼續使用System.out,並在調用應用程序時使用「>」將其重定向到該文件。您仍然可以保留stderr以直接輸出控制檯。 或者當你寫「外部java」時,你的意思是別的嗎?

2

System.out基本上是一個OutputStream;它默認指向控制檯。相反,您可以創建一個指向您選擇的文件的新FileOutputStream實例,並通過System.setOut設置它來識別此流。這將在程序/應用程序的整個生命週期中爲您完成。檢查this鏈接獲取完整的代碼。