熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

誰持彩練當空舞-- 看Java、C#大比拚

2013-11-15 11:40:42  來源: JSP教程 

    Java作為一種編程語言如此普及的原因之一是它解決了其他語言中常見的I/O網絡操作中非常困難的問題C#語言也采用了與Java類似的方法提供了一些庫來完成對I/O和網絡的操作並隱藏了其復雜的實現方法本篇文章將著重討論C#中與I/O網絡操作有關的名字空間以及這些庫的一些模板的通用用法為了方便熟悉Java的編程人員更好地掌握C#使廣大讀者能夠對二種語言進行比較在本篇文章中我們也都給出了相同功能在Java中的實現方法
  理解流操作
  Java和C#中的流通常與從控制台文件系統或網絡讀取數據或向這些設備寫數據有關在這二種語言間如果程序需要移動或對許多字節的數據進行操作都會較多地用到流操作
  Java提供了二個抽象類javaioInputStream和javaioOutputStream其中包括一些允許程序讀或寫流數據的方法C#則把這二個類合並為一個SystemIOStream與有一個用於讀流數據一個用於寫流數據的二個對象不同C#中的Stream對象需要通過測試CanRead CanWrite屬性對其讀寫能力進行檢測
  同步I/O操作
  同步I/O操作在這二種語言中是十分相似的無論是Java中的javaioInputStream和 javaioOutputStream還是C#中的SystemIOStream都有每次只對一個字節數據進行操作的方法也有每次對一批數據進行操作的方法(C#缺乏一次對一個字節數組操作的能力只能通過偏移量/長度參數對字節數組進行操作
  表Java和C#中的同步I/O操作
   
  Java編程人員需要注意的一點是不要忘記IOException與Java不同C#編譯器在編譯時不要求處理異常情況
  Java缺乏完成異步I/O操作的正式方法它沒有內置的方法對流進行讀然後再檢查其結果其中最相似的一種模擬是在同步操作時產生一個javalangThread線程使得該線程引起側放作用(某些指令取出後暫時不執行放在一邊)或完成檢查工作C#的庫中有內置的異步I/O操作命令
  例如要在Java中執行一個可以對狀態進行檢查的異步read( byte[] b )操作下面是一種可能的實現方法
   file:// 保存讀操作的側放作用的變量
   int read; file:// 保存read的結果
   IOException exception; // 保存可能發生的異常
   Object wait
   // 在檢查結束前需要保留的一些值
  
   file://InputStream變量is中有關read的封裝
   ( new Thread( new Runnable() {
  public void run() {
  try {
  read isread();
  
   } catch( IOException error ) {
    exception error;
  
   } finally {
  synchronized( wait ) {
  file:// 喚醒等待這一變量的其他進程
  // 執行read操作
  waitnotifyAll();
  }
  // 調用檢查方法
  callback();
  }
   }
   } ) )start();
  這將使得read的值或執行讀操作的異常情況被分別存儲在read和exception中另一個依賴於變量wait的進程可能繼續等待或完成檢查的方法
  C#提供了封裝了上述全部功能的BeginRead和EndRead這二個方法BeginRead的作用與Read類似但它對二個或更多的變量━━一個AsyncCallback變量和一個狀態對象進行操作返回一個可以稍後用來檢查異步讀進程的IAsyncResult對象標准的BeginRead的用法與下面的用法相似
  IAsyncResult iar sbsBeginRead( buffer
           new AsyncCallback( = callback ) null );
  帶callback方法的用法如下
  public void callback( IAsyncResult iar )
  要檢查實際讀取了多少字節可以調用帶IAsyncResult對象參數的EndRead方法需要記住的是在BeginRead執行完畢之前EndRead的調用將被阻塞要在沒有阻塞的情況下檢查read的狀態可以檢查返回的IAsyncResult變量的IsCompleted屬性另外需要注意的是在異步read完成之前緩沖區中的內容是不可靠的
  實現流操作
  Java和C#中的流數據非常地相似如果對Java中的流操作足夠熟悉在C#中完成流操作就不會是太困難的事兒了Java和C#中實現流操作的最主要的差別不僅僅是需要實現的適當的讀或寫方法還有C#中的Stream類還可以作為讀者作者和准確反映Stream容量的屬性
  表Java和C#中Stream操作的實現
   
  C#中的Stream類在完成某一種功能時提供了多種選擇最重要的Read和Write(二者都需要一個字節數組偏移量長度三個參數)這二個方法就足夠了因為所有方法的執行都會用到其他的方法簡單的read/write方法將能夠給流添加所需要的功能缺省的ReadByte和WriteByte的執行方式將把long型變量與字節數組之間進行轉換異步執行的BeginRead和BeginWrite方法將在獨立的線程中執行Read或Write方法
  這篇稿子的大部分篇幅談論的都是C#中的SystemIOStream類有關在這裡我們還需要討論一下SystemIOTextReader和SystemIOTextWriter這二個類這二個類與Java處理I/O的方式十分相似其中的一個類負責處理讀取操作另一個類則負責處理寫操作C#中的Stream對象掩蓋了如何讀取寫的有關細節TextReader和TextWriter則分別獨立地存儲著讀取或寫入的字節由上述二種類衍生出的最通用的類是SystemIOStreamReader和SystemIOStreamWrtiter類這二個類都可以對一個Stream對象進行操作SystemTextEncoding對象指定一個字節流如何轉換為字符流(缺省情況下C#使用UTF進行編碼/解碼
  如果需要使用與流類似的功能而且需要對字符而不是字節進行操作使用TextReader和TextWriter二個類的子類要比使用Stream類簡單得多雖然如果Stream動用得當也可以使用StreamReader和StreamWriter類實現流操作
  文件系統I/O
  在Java中完成磁盤操作是十分簡單的通常情況下它就是操作javaioFile對象和使用javaioFileInputStream或javaioFileOutputStream跟我們在上面看到的一樣C#在許多方面與Java相同但也有一些不同之處
  與Java一樣C#的文件對象與底層的文件系統之間並沒有特別緊密的聯系我們可以為一個不存在的文件創建一個File對象也可以為存在的文件創建一個File對象並在C#不知道的情況下將它移到別處由於擁有CreateText或AppendText等向文件系統返回一個流的靜態方法因此與Java不同的是C#中的File對象的作用要重要得多
  在Java中要創建一個新文件或向文件寫內容則必須使用FileInputStream
  FileOutputStream fos = new FileOutputStream( brandnewfiletxt);
  foswrite( )
  但在C#中就可以使用
  Stream s = FileCreate( brandnewfiletxt );
  或者使用
  StreamWriter sw = FileCreateText( brandnewfiletxt );
  來得到一個新文件的Stream或StreamWriter(Java中的添加可以通過設置FileOutputStream的構建者之一的append屬性來完成)Java允許使用javaioFileInputStream從文件中讀取內容而C#則有Open Write和OpenText等靜態的方法最後C#在Open方法中提供了更詳細的控制━━這一方法允許設置文件的權限和訪問環境
  表操作文件讀寫的方法
   
  C#中值得一提的改進是FileCopy方法困擾大多數Java編程人員的一個與文件系統I/O有關的問題是不能正確地移動文件javaioFile中包含一個可以對文件重新命名的renameTo方法但它只在文件系統內有效大多數情況下編程人員都必須編寫自己的文件移動命令一般是利用javaioFileInputStream和javaioFileOutputStream拷貝文件然後再刪除原來的文件C#中的Copy方法可以很方便地移動文件但FileMove也不能跨卷和文件系統移動文件
  C#的文件系統無須處理Java必須處理的跨平台問題因此也就沒有與javaioFilepathSeparator或javaioFileseparator功能類似的對象不幸的是這也就意味著在C#中不存在受到廣大編程人員喜愛的javaioFile構造器
  public File( File parent String child )
  使用C#的編程人員可以使用下面的命令來構造一個新的SystemIOFile對象
  File parent
  File child new File( parentFullName + \\ + childName );
  Understanding Networking
  二種語言都圍繞著基本協議提供了一些抽象層Java中的Socket類的抽象程度要遠高於C#中的SystemNetSocketsSocket類
  Java和C#都提供了對網絡的不同抽象層編程人員可以使用不同的網絡接口完成對網絡的操作
  表Java和C#中的網絡層次
  
  應答/請求層可以用於HTTP類的請求其中的一端開始啟動一個連接發送一些字節的數據然後停止等待對方作為應答發回的一些字節對於象流這樣更靈活的操作協議層的用處更大對於大多數的Java編程人員來說除非需要完成性能非常高的網絡操作不需要對套接字進行直接控制如果需要C#仍然提供了對原始的Berkeley套接字進行控制的能力
  應答/請求層
  這個層次抽象掉了所有網絡層的細節提供了一個可以雙向傳輸數據的象流那樣的接口Java可以接受HTTP URL並通過下面的命令完成GET命令
  URL url= new URL( );
  URLConnection urlConnection urlopenConnection();
  InputStream input urlConnectiongetI
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19431.html
    相關文章
      没有相关文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.