rosial

          lost memory
          數據加載中……

          zz - Java 流(Stream)簡介:1、基本的輸入流和輸出流

          原作者為csdn上的 YidingHehttp://blog.csdn.net/YidingHe

          本人打算寫幾篇文章,介紹一下流。本文是針對初學者的,加上本人水平有限,所以不敢說寫得很高深。如果你是初學者,而且對流這個東西很頭疼,你就應該看看這個。

           

          本文發表在:http://blog.csdn.net/YidingHe,轉載請保留出處。

           

           


           

          流是 Java 中最重要的基本概念之一。文件讀寫、網絡收發、進程通信,幾乎所有需要輸入輸出的地方,都要用到流。

          流是做什么用的呢?就是做輸入輸出用的。為什么輸入輸出要用“流”這種方式呢?因為程序輸入輸出的基本單位是字節,輸入就是獲取一串字節,輸出就是發送一串字節。但是很多情況下,程序不可能接收所有的字節之后再進行處理,而是接收一點處理一點。比方你下載魔獸世界,不可能全部下載到內存里再保存到硬盤上,而是下載一點就保存一點。這時,流這種方式就非常適合。

          在 Java 中,每個流都是一個對象。流分為兩種:輸入流(InputStream)和輸出流(OutputStream)。對于輸入流,你只要從流當中不停地把字節取出來就是了;而對于輸出流,你只要把準備好的字節串傳給它就行。

                    ______________Java 程序____________
                    |                                 |
          外部系統 --|--(輸入流)--> 處理邏輯 --(輸出流)---|--> 外部系統
                    |_________________________________|



          流對象是怎么獲得的呢?不同的外部系統,獲取流的方式也不同。例如,文件讀寫就要創建 FileInputStream/FileOutputStream 對象,而網絡通信是通過 Socket 對象來獲取輸入輸出流的。一般來說,如果一個類有 getInputStream() 或 getOutputStream() 這樣的方法,就表明它是通過流對象來進行輸入輸出的。

           

          InputStream 是輸入流,下面是一個通過 InputStream 讀取文件的例子:

          1. import java.io.File;  
          2. import java.io.FileInputStream;  
          3. import java.io.IOException;  
          4. import java.io.InputStream;  
          5. import java.io.FileNotFoundException;  
          6. import java.util.Arrays;  
          7.    
          8. /** 
          9.  * 通過流讀取文件 
          10.  */  
          11. public class ReadFileDemo {  
          12.    
          13.     // 程序入口  
          14.     public static void main(String[] args) {  
          15.         String path = "c:/boot.ini";  
          16.         File file = new File(path);  
          17.    
          18.         // 創建輸入流  
          19.         InputStream is;  
          20.         try {  
          21.             is = new FileInputStream(file);  
          22.         } catch (FileNotFoundException e) {  
          23.             System.err.println("文件 " + path + " 不存在。");  
          24.             return;  
          25.         }  
          26.    
          27.         // 開始讀取  
          28.         byte[] content = new byte[0];       // 保存讀取出來的文件內容  
          29.         byte[] buffer = new byte[10240];    // 定義緩存  
          30.    
          31.         try {  
          32.             int eachTime = is.read(buffer); // 第一次讀取。如果返回值為 -1 就表示沒有內容可讀了。  
          33.             while (eachTime != -1) {  
          34.                 // 讀取出來的內容放在 buffer 中,現在將其合并到 content。  
          35.                 content = concatByteArrays(content, buffer, eachTime);  
          36.                 eachTime = is.read(buffer); // 繼續讀取  
          37.             }  
          38.         } catch (IOException e) {  
          39.             System.err.println("讀取文件內容失敗。");  
          40.             e.printStackTrace();  
          41.         } finally {  
          42.             try {  
          43.                 is.close();  
          44.             } catch (IOException e) {  
          45.                 // 這里的異常可以忽略不處理  
          46.             }  
          47.         }  
          48.    
          49.         // 輸出文件內容  
          50.         String contentStr = new String(content);  
          51.         System.out.println(contentStr);  
          52.     }  
          53.    
          54.     /** 
          55.      * 合并兩個字節串 
          56.      * 
          57.      * @param bytes1       字節串1 
          58.      * @param bytes2       字節串2 
          59.      * @param sizeOfBytes2 需要從 bytes2 中取出的長度 
          60.      * 
          61.      * @return bytes1 和 bytes2 中的前 sizeOfBytes2 個字節合并后的結果 
          62.      */  
          63.     private static byte[] concatByteArrays(byte[] bytes1, byte[] bytes2, int sizeOfBytes2) {  
          64.         byte[] result = Arrays.copyOf(bytes1, (bytes1.length + sizeOfBytes2));  
          65.         System.arraycopy(bytes2, 0, result, bytes1.length, sizeOfBytes2);  
          66.         return result;  
          67.     }  
          68. }  

           

           

          雖然寫得很啰嗦,但這確實是 InputStream 的基本用法。注意,這只是一個例子,說明如何從輸入流中讀取字節串。實際上,Java 提供更簡單的方式來讀取文本文件。以后將會介紹。

          相比從流中讀取,使用 OutputStream 輸出則是非常簡單的事情。下面是一個例子:

          1. import java.io.OutputStream;  
          2. import java.io.FileOutputStream;  
          3. import java.io.File;  
          4. import java.io.IOException;  
          5. import java.util.Date;  
          6.    
          7. /** 
          8.  * 將當前日期保存到文件 
          9.  */  
          10. public class SaveFileDemo {  
          11.    
          12.     public static void main(String[] args) throws IOException {  
          13.         String path = "c:/now.txt";  
          14.    
          15.         File file = new File(path);  
          16.         if (!file.exists() && !file.createNewFile()) {  
          17.             System.err.println("無法創建文件。");  
          18.             return;  
          19.         }  
          20.    
          21.         OutputStream os = new FileOutputStream(file);   // 創建輸出流(前提是文件存在)  
          22.         os.write(new Date().toString().getBytes());     // 將當前時間寫入文件  
          23.         os.close();                                     // 必須關閉流,內容才會寫入文件。  
          24.         System.out.println("文件寫入完成。");  
          25.     }  
          26. }  

           

          Java 還提供其它的流操作方式,但它們都是對 InputStream 和 OutputStream 進行擴展或包裝。所以這兩個類是基礎,必須要理解它們的使用。

           

           

          posted on 2012-03-02 20:20 rosial 閱讀(290) 評論(0)  編輯  收藏 所屬分類: 技術轉帖留存

          主站蜘蛛池模板: 宜州市| 上思县| 景泰县| 义乌市| 门头沟区| 潼南县| 梨树县| 葵青区| 徐水县| 铜陵市| 桂林市| 绿春县| 吴桥县| 高阳县| 汉中市| 汾阳市| 吉木萨尔县| 鸡泽县| 中卫市| 贺州市| 永吉县| 峨眉山市| 临朐县| 岳普湖县| 青川县| 东城区| 随州市| 武安市| 齐齐哈尔市| 石嘴山市| 莱州市| 阿克苏市| 类乌齐县| 大安市| 逊克县| 平阴县| 十堰市| 厦门市| 诸暨市| 苍南县| 望奎县|