程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 體驗流調試的威力

體驗流調試的威力

編輯:JAVA編程入門知識

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 


  假如你在使用流的過程中出現了問題,那麼你也許需要調試功能。
  
  Java的I/O框架是基於一系列連接在一起的流實現的。當這種設計增強了部件重用性的同時,它也使得定位錯誤變得困難。通過在流中插入你自己定義的調試流的時候,錯誤定位將會變得更簡單。例如,調試流CountingOutputStream這個類報告它已經寫了多少個字節。這個功能對使用flush造成字節丟失的情況非常有用。
  
  下面是一個使用CountingOutputStream的例子:
  
  package com.generationjava.io;
  
  import java.io.IOException;
  import java.io.OutputStream;
  import java.io.FilterOutputStream;
  
  public class CountingOutputStream extends FilterOutputStream {
  
  private int count;
  
  public CountingOutputStream( OutputStream out ) {
  super(out);
  }
  
  public void write(byte[ ] b) throws IOException {
  count += b.length;
  super.write(b);
  }
  
  public void write(byte[ ] b, int off, int len) throws IOException {
  count += len;
  super.write(b, off, len);
  }
  
  public void write(int b) throws IOException {
  count += 2;
  super.write(b);
  }
  
  public int getCount( ) {
  return this.count;
  }
  
  }
  在下面的小片代碼中,存在一個簡單的錯誤—流既沒有被flush也沒有被關閉。
  
  File file = ...;
  byte[ ] data = ...;
  OutputStream out = new BufferedOutputStream(
  new FileOutputStream( file )
  );
  out.write(data);
  插入CountingOutputStream來發現問題:
  
  File file = ...;
  byte[ ] data = ...;
  CountingOutputStream cos = new CountingOutputStream(
  new FileOutputStream( file )
  );
  OutputStream out = new BufferedOutputStream( cos );
  out.write(data);
  System.err.println( "Bytes written: "+cos.getCount( ) );
  假如這段代碼輸出:
  
  Bytes Written: 0
  
  那麼可以很快的發現問題出在BufferedOutputStream上,它沒有發送任何東西給FileOutputStream流。這種方法可以更輕易發現作為緩沖的流沒有flush它的緩沖。
  
  雖然這個例子過於簡化了,但是它仍然證實了流調試的有效性。當鏈中存在四個或者更多的流的時候,插入並且移動調試流將幫助開發者更快的發現問題。


 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved