1. 程式人生 > >java 輸入流,輸出流和緩衝區的個人學習感悟

java 輸入流,輸出流和緩衝區的個人學習感悟

2015年國慶以後,很慶幸加入了我們學校的"移動網際網路實驗室",當時加入實驗室只是一個C語言和java語言初學的毛頭小子。2015國慶年至2015年12月完成了小組之間的第一個任務“趣味測試”,現在覺得好low,也是在這一段時間自己接觸了Android開發,初學了一些關於Android的基礎知識。2016年3月開學歸來,轉眼之間就是大二下學期,參加了人生中第一個專案“i西科”app產品的研發,3月到4月階段基本出於閱讀該APP的原始碼階段,大致在4月份左右,師兄師姐都準備春招,所以實驗室的主力基本變成了我們這些大二的毛頭小子,實驗室的老師也若由我們折騰。在一邊上課一邊研發中(遺憾的是資料結構沒學好),時間就到了9月份,在這之前,自己在網上瀏覽器大量關於Androd開發的知識(自己學習中遇到的),當然在這過程中自己也沒做一些有用的筆記,但自己遇到過的問題大多儲存在記憶中,同時喜訊傳來師兄師姐都拿到了不錯的offer,比如京東,美團,去哪,百度,新浪等大型企業。9月份,自己也就是大三了,10月份,自己帶領一個四人小組的團隊完成了實驗室老師拿到的一個專案(這時"外包"這個名詞進入了我們記憶中),我們用很P的技術,很P的編碼格式完成了該專案,在這過程中被老師罵的天翻地覆。11月份,有重回"i西科"這個專案組,負責後期APP的完善工作,花了大量時間優化程式碼。到了2017年,一個新的開始,我們有當初的小鮮肉轉變為老臘肉,跟隨師兄師姐的步伐,準備春招(體驗一下,為暑假的秋招做準備)。春招長話短說,大中型企業注重基礎,當然985/211這些學校里人們的潛意識裡比我們這種二流的本科學校基礎好了不知幾倍,確實如此,在春招這個過程中,自己發現基礎真是硬傷,(雖然接到去哪兒(沒面)和阿里的面試,自己面得一塌糊塗)。

以上知識筆者回憶一下之前學習經歷得感慨,讀者可自行掠過。

以前寫程式碼時,關於檔案得輸入輸出和緩衝,雖然瞭解,但是沒仔細想想裡面得機制,這些天又重讀了一下java方面得書,順便總結一下,當作筆記。

學過物理得讀者相信一定知道參考系這個概念,其中提到了相對和絕對等概念,在這裡的java輸入和輸出是相對而言。

“流”是一種相對概念,從鍵盤輸入資料,將處理結果寫入檔案,以及讀取檔案的內容等動作都可視為流的操作。流裡面的陣列又字元(charater)和位(bits)構成,看下圖有助於理解。

在java中,可以通過InputStream,,Reader類來處理輸入,OutputStream,Writer類來處理輸出(Reader和Writer可以參照上圖來理解)。其中InputStream和OutputStream來處理二進位制檔案(例如伺服器發來的資料中含有一個下載連結,就要轉化為InputStream來下載了),而Reader和Writer是用來處理純文字檔案(text file)。

筆者在這取個例子 :

“檔案的讀取”

      1:你要讀取檔案,首先要獲取一個讀取檔案的物件,例如FileReader 類的物件 fileReader(用流來解釋解釋:檔案的資料讀取到程式中,即為輸入流)

2:根據獲取到的物件 fileReader來實現檔案裡面的資料讀入到程式裡面(檔案在外存,即硬碟或磁碟,程式在記憶體)

3:得到了全部資料之後,你就要把讀取檔案的物件關掉,即回收或kill掉

“檔案的寫入”

1:你要從把程式裡面的資料寫入到檔案裡面,首先要獲取一個寫入檔案的物件,例如FileWriter類的物件fileWriter(用流來解釋:程式的資料寫入到檔案中,即為輸出流)

2:根據獲取到的物件fileWriter來實現程式的資料寫入到程式裡面

3:資料寫完之後,你就要把寫入檔案的物件關掉,即回收或kill掉

接下來,我們再說說緩衝區(buffer)

緩衝區其實就是檔案和程式之間訪問的橋樑。具有緩衝區的檔案處理方式是在訪問時先把資料放置到緩衝區,而不是直接從磁碟中讀取,這種處理方式的好處是不需要不間斷的從磁碟讀取資料,因此可以增加程式執行的效率。缺點也就很明顯了,緩衝區既然要儲存資料,那肯定需要暫用記憶體了,現在一般pc的記憶體是4G或8G,還有就問你電腦系統宕機或檔案沒有關閉,緩衝區的資料何去何從?

下面我們畫圖來解釋這種結構吧

相信讀者看了上圖也就懂了,筆者也就不做過多介紹了。