<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(287) 評論(0)  編輯  收藏 所屬分類: 技術轉帖留存

    主站蜘蛛池模板: 久久精品免费观看| 暖暖免费中文在线日本| 亚洲免费综合色在线视频| 国产成人精品日本亚洲语音 | 亚洲AV中文无码乱人伦下载| 亚洲精品国偷自产在线| 亚洲美女视频一区二区三区| 亚洲人成人伊人成综合网无码| 免费激情网站国产高清第一页| 美女视频黄的免费视频网页| 2021国产精品成人免费视频| 国产三级免费观看| 国产亚洲无线码一区二区| 亚洲午夜精品一区二区公牛电影院| 亚洲.国产.欧美一区二区三区| 精品国产福利尤物免费| 免费观看激色视频网站(性色)| 全黄性性激高免费视频| 久久久久久亚洲Av无码精品专口 | 99在线精品视频观看免费| 国产免费av片在线无码免费看| 日本亚洲视频在线 | 亚洲国产91在线| 人妻巨大乳hd免费看| 精品国产无限资源免费观看| 婷婷亚洲天堂影院| 亚洲成人黄色网址| 国产成人无码精品久久久久免费| 亚洲免费一级视频| 亚洲色婷婷综合开心网| 亚洲伊人色一综合网| 2022免费国产精品福利在线 | 日韩毛片无码永久免费看| 亚洲中文字幕在线乱码| 一本色道久久88—综合亚洲精品| 精品97国产免费人成视频| 免费看无码自慰一区二区| 99人中文字幕亚洲区| 无码人妻一区二区三区免费视频| 日韩视频在线精品视频免费观看 | 亚洲综合小说久久另类区|