這里的記錄日志是利用打印流來實現的。
文本信息中的內容為String類型。而像文件中寫入數據,我們經常用到的還有文件輸出流對象FileOutputStream.
1 File file = new File("F:\\a.txt"); 2 FileOutputStream outputStream = new FileOutputStream(file,true);//第二個參數為追加文本
3 outputStream.write(97);
上面的代碼執行完之后,a.txt中的內容存的是a,因為write方法接收的為byte類型的數據,97對應的ASCII碼為a。
假設我就想將97寫入到文件中呢?那么得將第三行代碼改為
1 outputStream.write("97".getBytes());//先將97作為字符串再轉換為byte數組
而PrintStream得出現,是的我們寫數據入文件變得十分方便,你傳入的是什么,就會給你寫入什么數據。原因是他內部幫我們轉換活了
1 File file = new File("F:\\a.txt"); 2 PrintStream printStream = new PrintStream(file); 3 printStream.println(97); 4 printStream.println('a'); 5 printStream.println("hello world"); 6 printStream.println(true); 7 printStream.println(3.14); 8 printStream.println(new Student("酒香逢"));
上面這段代碼得到的結果為:

可見不管什么數據類型,都會轉換為字符串,甚至是對象也不例外。
這里再說一下學習java時少不了用到的一句代碼:System.out.println();代碼中的out,為System類中的一個PrintStream對象,稱之為標准輸出流對象。標准輸出流對象會將數據打印到控制台上。查閱API可知有如下方法,
static void setOut(PrintStream out) //重新分配“標准”輸出流。
可以重新指定輸出流對象,即將System.out.println();的輸出內容打印到我們想打印到的地方。
1 File file = new File("F:\\a.txt"); 2 PrintStream printStream = new PrintStream(file); 3 System.setOut(printStream); 4 System.out.println("打印到F:\\a.txt中");
這時候內容回寫入到文件a.txt中去,而不是打印在控制台中。
最后回歸本文重點,日志信息的保存。
假設有代碼:
1 try{ 2 int n = 5/0; 3 }catch(Exception e){ 4 e.printStackTrace(); 5 }
執行結果會拋出我們想要的錯誤日志信息。
java.lang.ArithmeticException: / by zero
at log.DemoLog.main(DemoLog.java:26)
這時候想將日志信息保存起來怎么辦呢?

看到Exception類中的這3個重載方法,我們不難得知,只要給他指定一個打印輸出流對象當中,即可將日志信息保存到我們想要的地方。
1 File file = new File("F:\\a.log"); 2 PrintStream printStream = new PrintStream(file); 3 try{ 4 int n = 5/0;//除數為零異常
5 }catch(Exception e){ 6 e.printStackTrace(printStream); 7 }
上面這段代碼執行重復執行多次,

但是記錄的日志信息永遠只會記錄一條。這明顯不是我們想得到的,日志信息,總不能只記錄一條吧?那么它存在又有什么用?
其實,追加文本信息的決定者不是e.printStackTrace(printStream);方法,關鍵點在於流對象,

可見打印流對象是存在一個OutputStream接口作為參數的傳入對象。既然是接口,那么就無法new出OutputStream的對象了,可以用他的子類FileOutputStream對象作為參數傳入。並且,FileOutputStream流是可以追加的,
new FileOutputStream(file,true);//第二個參數為追加文本
此時將其作為參數傳入,PrintStream流自然也就可以追加內容了。
1 File file = new File("F:\\a.log"); 2 PrintStream printStream = new PrintStream(new FileOutputStream(file,true),true); 3 try{ 4 int n = 5/0;//除數為零異常
5 }catch(Exception e){ 6 e.printStackTrace(printStream); 7 }
將代碼執行3次后:

可以看到日志信息是保存有3條的,日志信息記錄保存目的達成!
