国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

流(stream)是怎么一回事

MangoGoing / 1618人閱讀

摘要:文件流,系統標準輸入輸出流,標準錯誤流,還有一開始提到的流,還有一些后臺技術如對請求響應流的抽象,都可以見到流的概念。語言的庫中定義了打開文件流時必須指定的集中打開方式,表示用于讀取,用于寫入,用于讀寫。

—— 對這個問題的思考來源于前幾天對 Java Socket 編程的嘗試,TCP 協議要求建立一個 Socket 連接(著名的三次握手)之后才能進行通信,而連接雙方進行數據的發送與接受,都是通過對輸入輸出的機制來完成的。

流的概念

流作為概念應該是語言無關的。文件IO流,Unix系統標準輸入輸出流,標準錯誤流(stdin, stdout, stderr),還有一開始提到的 TCP 流,還有一些 Web 后臺技術(如Nodejs)對HTTP請求/響應流的抽象,都可以見到流的概念。

K&R 在 C Programming Language 書中提到流是這樣定義的:

流 (stream) 是與磁盤或其它外圍設備關聯的數據的源或目的地。

可以把流理解成是對程序外界交換數據的一種抽象,這里的外界限定是有必要的,通常不會把程序內部的數據流動抽象為流,畢竟在程序內部,數據流動是由函數調用、返回來完成的。而當我們使用三個標準IO流時,我們關心的是怎樣通過它們與外界交互;當我們使用文件流時,我們關心的是將內存中的數據持久化到磁盤文件中(或從磁盤中讀數據導內存)。

于是數據從 A 處“流”向 B 處,可以類比像水流一樣從高處流向低處。在水流動的過程中,作為最基本物理組成單位的水分子是不變的,相應的數據流也有它最小的組成單位。在不同的編程語言中,這個最小單位通常是字節流(二進制流)中的字節,或者字符流(文本流)中的字符。

——但不會是其他數據類型,就像我們從來沒聽說過數字流?,或者浮點數流,甚至數組流?

因為字節是計算機保存數據的最終形式,而字符是其它數據結構序列化后的表現形式,也是人可以閱讀的形式。與外界的交互需要這些通用的格式。不關心數據的內容,只需要完整地傳輸原始數據時,考慮字節流即可;關心傳輸字符和字符串時,就需要對字符流進行操作,stdio.h頭文件里那一大坨輸入輸出函數就是干這個的。比如fgetc(FILE *stream)從文本流中讀入一個字符。

另一方面,根據數據流動的方向,可以再抽象出輸出流和輸入流的概念。從程序內部到外部的流向是輸出流,從程序外部到內部的流向是輸入流。

C 語言的stdio.h庫中定義了打開文件流時必須指定的集中打開方式,"r"表示用于讀取,"w"用于寫入,"r+"用于讀寫。類似地,Java 語言的java.io包中包含了InputStream, OutputStream 明確區分的輸入流類和輸出流類,并且二者都是抽象類,意味著必須根據需要使用它們各自的子類進行實例化。

通過流操作實現(最)簡單的文件拷貝

根據實際的代碼可以幫助理解stream,下面是一段用C語言標準庫實現的最簡單的文件拷貝功能。

出于學習目的,這段代碼偷懶沒有任何容錯功能,是典型的反面教材, 不過 whatever 了,不信你真拿去編譯一下,是真的可以完整拷貝文件!除了不能拷貝目錄,不能拷貝不存在的文件,不能拷貝文件權限,不能漏掉目的文件名或者路徑,不能靈活處理文件軟鏈接硬鏈接。等等等等blahblah(所以其實連看上去很簡單的cp程序也是要有一大坨因素要考慮和支持的(啊跑題了

// mini_cp.c
#include 
#define BUFFER_SIZE 512

int main(int argc, char *argv[])
{ 
  // 從命令行參數中獲得 SOURCE 和 DES 文件流
  FILE *src = fopen(argv[1], "rb");
  FILE *des = fopen(argv[2], "wb");
  
  long int num;
  
  // buffer 是讀寫的緩沖數組
  char buffer[BUFFER_SIZE];

  while(!feof(src)) {
    num = fread(buffer, sizeof(char), BUFFER_SIZE, src);
    fwrite(buffer, sizeof(char), num, des);
  }

  fclose(src);
  fclose(des);

  return 0;
}

這個自制的mini_cp程序不難理解,核心的邏輯可以分解為三個步驟:

打開源文件流FILE *src和目的文件流FILE *des

循環執行 { 每次從src流讀取最多512字節的數據 => 并寫入des流 } 直到源文件讀取結束

關閉文件流

核心邏輯是非常清晰明了的,這樣的邏輯也是流操作的普遍原理,嘗試其他語言的實現,其實都已經大同小異,往往都少不了一個緩沖區的概念(或對象)。

來看一下 Java 版本的同等實現:

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Copy {
    
    private static final int BUFFER_SIZE = 512;

    public static void main(String[] args) throws IOException {
        
        File srcFile = new File(args[0]);
        File desFile = new File(args[1]);

        int recvBytesSize;
        byte[] buffer = new byte[BUFFER_SIZE];

        FileInputStream in = new FileInputStream(srcFile);
        FileOutputStream out = new FileOutputStream(desFile);

        while((recvBytesSize = in.read(buffer)) != -1) {
            out.write(buffer, 0, recvBytesSize);
        }

        in.close();
        out.close();

    }
}

面向對象味更濃(代碼更冗長)了有木有?但也正是因為面向對象,Java 把理論上的 stream 抽象為類,讓我們直接獲得類的實例(即對象),從而對對象進行操作。還是挺不賴的是吧,雖然代碼更長了沒錯,但是更 OO 啊~

寫到這里已經能回答流基本是怎么一回事了,那么最后順便再來放一段拷貝程序的ruby實現;

require "fileutils"
FileUtils.cp("SOURCE.txt", "DEST.txt")

哈?

嗯。

... That"s why we love Ruby...(逃。。。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64758.html

相關文章

  • 《Java8實戰》-第六章讀書筆記(用收集數據-01)

    摘要:收集器用作高級歸約剛剛的結論又引出了優秀的函數式設計的另一個好處更易復合和重用。更具體地說,對流調用方法將對流中的元素觸發一個歸約操作由來參數化。另一個常見的返回單個值的歸約操作是對流中對象的一個數值字段求和。 用流收集數據 我們在前一章中學到,流可以用類似于數據庫的操作幫助你處理集合。你可以把Java 8的流看作花哨又懶惰的數據集迭代器。它們支持兩種類型的操作:中間操作(如 filt...

    EscapedDog 評論0 收藏0
  • Flink 靈魂兩百問,這誰頂得住?

    摘要:由于配置流是從關系型數據庫中讀取,速度較慢,導致實時數據流流入數據的時候,配置信息還未發送,這樣會導致有些實時數據讀取不到配置信息。從數據庫中解析出來,再去統計近兩周占比。 Flink 學習 https://github.com/zhisheng17/flink-learning 麻煩路過的各位親給這個項目點個 star,太不易了,寫了這么多,算是對我堅持下來的一種鼓勵吧! showI...

    Guakin_Huang 評論0 收藏0
  • Java8學習小記

    摘要:但有一個限制它們不能修改定義的方法的局部變量的內容。如前所述,這種限制存在的原因在于局部變量保存在棧上,并且隱式表示它們僅限于其所在線程。 2014年,Oracle發布了Java8新版本。對于Java來說,這顯然是一個具有里程碑意義的版本。尤其是那函數式編程的功能,避開了Java那煩瑣的語法所帶來的麻煩。 這可以算是一篇Java8的學習筆記。將Java8一些常見的一些特性作了一個概要的...

    CHENGKANG 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<