IO技術在Java上是非常常見的,今天來梳理一下IO方面的知識。
在很長的一段時間裏面,我也很困惑,IO裏面一大堆,又是InputStream,outputStream 的,然後又是Writer 和 Reader ,仔細一看,唉。有些還帶有Buffer的。本來暈頭轉向的,現在徹底找不到北了。
首先,先來個分類。分類都一樣,按兩大類分:
按照流向分是輸入流和輸出流,
按照處理單位分爲字節流和字符流
下面來看看這張圖:
圖不是我畫的,是別人那裏複製粘貼過來的,哈哈。這裏粘貼的,在此謝謝了!
首先要搞清楚一點的是:
輸入流和輸出流,什麼時候用輸入流,什麼時候用輸出流。所謂的輸入輸出是相對於程序(內存)來說的,如果是從外面(硬盤)讀取數據,那麼就用輸入流,如果要往外面寫出數據,那麼就用輸出流。就這麼簡單,不要再迷糊了。
下面來看字節流和字符流:
從上面那張圖可以看到,字節流都是 InputStream 和 OutputStream 結尾的,而字符流是 Writer 和 Reader 結尾的,這就很好區分了嘛,一看就知道什麼是字節流,什麼是字符流。好了,搞清楚這個就看下一個問題,什麼時候該用字節流,什麼時候該用字符流?
記住,凡是操作文本文件,注意,是文本文件,那麼就用字符流。例如:txt記事本文件
凡是操作的是非文本文件,那麼就用字節流,例如:圖片,音頻,視頻。word文檔等
前面不是說文本文件都用字符流去操作麼,怎麼word是用字節流了呢?這不扯淡麼?別,這不是扯淡,word是不是也可以插入圖片等,對吧,前面不是說圖片是用字節流去操作的麼。對吧,還有一點就是word是經過加密了的,只有word軟件才能打開,其他軟件都不行,對吧,這就對了嘛。所以,word也是用字節流去操作。
字節流和字符流都搞清楚了,咦,圖上面不是還有 buffer 的麼?這又是什麼鬼,唉。名字上不是很清楚了麼,人家是帶了個Buffer 緩衝數組的啊,然後就沒其他了。
不過還有一點很重要的是;凡是帶有Buffer的,都不具備操作文件的能力,也就是說,它本身是不能去讀取和寫入東西的,沒事可以看看這些buffer的構造方法,帶有Buffer的構造方法裏面,一般都需要你傳入一些inputStream或者outStream,對了,順便再說一句,雖然不具備讀寫文件能力,但人家也有close的方法,這是爲什麼呢?還有爲什麼,沒爲什麼,你不是傳進去一個麼?其實關閉的就是你傳進去的這個。所以說,close buffer之後,就不需要對傳進去的進行關閉了,沒意義的!
好了,什麼基礎的理論知識先講到這裏,下面開始學習!代碼是最好的老師嘛,對吧,不管什麼都要實踐一下,
FileInputStream和FileOutputStream的簡單使用
Java_IO_BufferedIntputStream_And_BufferedOutputStream
Java_IO_ObjectInputStream_And_ObjectOutputStream
Java_IO_SequenceInputStream文件的合併
(後續更新。。。)