Java Stream简介, 流的基本概念.
在Java or .net編程中,? 我們經常見到"stream" 這個字眼.
我們大概知道這是個流的意思, 如果看完本文的話, 應該會有1個大概的概念.
一, Java中什么是Stream(流)
1.1 1段輸出文件內容到屏幕的代碼
假如我們有個需求, 利用java寫1個程序, 將1個硬盤上的文件(/home/gateman/tmp/build.xml)內容輸出到屏幕上.
Java的代碼如下:
import java.io.*;public class Stream1{public static void f() throws IOException{FileReader fr = new FileReader("/home/gateman/tmp/build.xml");int ch; //not charch = fr.read(); //throws IOEXCEPTIONwhile(ch > -1){ //if ch = -1, means got the end of the fileSystem.out.printf("%c",(char)ch);ch = fr.read(); //throws IOEXCEPTION}} }上面的代碼很簡單,
1.首先我們見到代碼定義了1個 FileReader 對象fr.? 它的某個成員指向了我們要讀的文件build.xml.
2.然后多次執行 fr.read()方法, 每執行一次, 將fr.read()打返回結果輸出到屏幕. 直到fr.read()的返回值是-1.
這里包括我也許有人會想, 為什么要 read 那么多次啊, 干脆寫1個強大的read()方法把文件內容都讀過來不就完了嗎?
這就是涉及了流的概念.
1.2 搬水的例子
我們來舉個例子讓大家更加容易理解
問題1:
假如有兩個杯子, 其中1個有水, 另1個沒有水,? 它們的位置都不能移動.
請問有什么方法將有水杯子了的水搬去另1個杯子?
答案很多種,? 只需要1個碗, 把水倒進碗里, 然后把碗的水倒進另1個杯子里就ok了.
將這個思路應用到1.1 的例子, 就相當于1個強大的Read()方法把整個文件都讀完了.?
為什么這樣說?
1. 我們可以把有水的杯子看做1個文件, 水相當于文件的內容.
2. 沒水的杯子相當于屏幕. 我們就是需要把文件的內容輸出到屏幕
3. 中間的碗相當于內存,? 把有水的杯子的水倒進碗就是一次過把文件所有內容讀入內存啊.
4. 最后把碗的水倒進另1個杯子, 相當于把內存里的內容輸出到屏幕.
如下圖:
問題貌似解決了, 但是隨著這個問題的規模的擴大, 這個方法就不可行了.
例如需要搬運的不是一杯水,?? 而是把整個個池塘的水運到另一個池塘.
用碗來搬就不符合實際啊.
有人回說, 我一碗一晚的搬總會搬完?
問題是, 那個碗(內存)還可以其他東西,? 如果整個內存都用于搬運數據, 那么就導致程序在搬運數據的時間里占用大部分操作系統的內存.? 留給其他程序的內存就很少了!
1.3 搬水的例子的另1個解決方法: 管道
假如我們的內存(碗)容量很少, 但是要搬運整個池塘怎么辦呢?
其實我們就可以用一條水管接通兩個池塘.
管道上有1個按鈕, 每按1次那個按鈕, 就允許一點水通過管道.
如下圖:
結合1.1 的java代碼例子
實際上我們已經明白,? FileReader fr 這個對象就相當于1條管道, 這個管道有1個按鈕 fr.read(), 每執行1次, 就有一點水流(1個字符) 讀到內存(注意是內存, 而不是屏幕)!
1.4 本文開始1.1節java代碼的分析
我們再看回1.1 的代碼.
當執行碗上面的代碼后,
實際上建立了1條 從文件到內存的一條數據管道.
但是這時只是搭建好了1個管道, 并沒有數據傳輸
這個方法需要處理IOException
這個也不難理解, 每讀到1個字符, 就把這個字符輸出到屏幕上, 直到讀完整個文件.
如下圖:
而第一句建立的對象 FileReader fr實際上就是1個文件讀字符流
流(Stream)實際上就是從數據文件到程序的一條管道.
至于數據怎么從程序輸出到屏幕, 這個并不是流的范疇.
1.5 Java Stream流的定義
看完上面例子的話, 流的定義就很容易看懂了.
Stream是java的1個類, 這個類專門用于程序和外部設備的輸入輸出(IO). 基本上所有流都在 java.io這個包中.
實際上Stream就是數據在程序和外部設備的單向管道, 流的各種方法相當于管道上的各種按鈕.??
所謂的外部設備可以包括硬盤文件, 網絡設備, 另個程序等. 也就是當前程序之外的數據設備.
二, 為什么需要Stream(流).
看懂了上面的的例子, Stream存在的意義也很簡單.
1. 數據的傳輸量很大.
2. 內存有限.
3. 帶寬有限.
而Stream可以1點1點地逐步傳輸所有數據, 這就是Stream存在的根本意義.
想想我們是怎樣下載1個大文件的, 下載軟件(例如x雷)并不會占用你內存很大的空間, 而只是在內存劃分1個緩沖區, 一點一點地下載到自己的內存(緩沖區滿了再寫到硬盤), 這也是流的1個例子啊.
三,流的重要特性.
3.1 流是java里的一個類
也就是將流就是類的一種, 但反過來類不是流
3.2 數據并不會在流里自動傳輸
而是需要執行流的方法, 一次傳輸一定量的數據.
3.3 1個流對象只有1個傳輸方向
也就是說流是單向的, 數據要么從程序到設備(OutputStream), 要么從設備到程序(InputStream).
下一編 介紹留的分類以及java中的四大基本流.
總結
以上是生活随笔為你收集整理的Java Stream简介, 流的基本概念.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java里的数组介绍
- 下一篇: Java Stream(流)的分类, 四