一篇文章教你学会Java基础I/O流
文章目錄
- 一、初始IO流
- 1、什么是流
- 2、IO流的分類
- 二、字節輸入輸出流
- 1、字節輸入流(InputStream)
- 2、字節輸出流(OutputStream)
- 3、文件拷貝
- 三、處理流和轉換流
寫在前面: 我是「境里婆娑」。我還是從前那個少年,沒有一絲絲改變,時間只不過是考驗,種在心中信念絲毫未減,眼前這個少年,還是最初那張臉,面前再多艱險不退卻。
寫博客的目的就是分享給大家一起學習交流,如果您對 Java感興趣,可以關注我,我們一起學習。
前言:為什么要寫這篇文章,由于長時間不使用I/O流操作,導致很多知識都朦朦朧朧似懂非懂,今天抽空把這部分內容認真復習了下,順便寫篇文章加深印象。I/O流在很多場景中都有使用,比如文件上傳下載、socket通信等。本文主要介紹常用字節流,其它字符流、轉換流用法類似就不一一介紹。
一、初始IO流
1、什么是流
數據的傳輸,可以看做是一種數據的流動,按照流動的方向,以內存為基準,分為輸入input 和輸出output ,即流向內存是輸入流,流出內存的輸出流。
Java中I/O操作主要是指使用java.io包下的內容,進行輸入、輸出操作。簡而言之,輸入也叫做讀取數據,輸出也叫做作寫出數據。
2、IO流的分類
按照流的方向可以分為:輸入流和輸出流
- 輸入流 :把數據從其他設備上讀取到內存中的流。
- 輸出流 :把數據從內存 中寫出到其他設備上的流。
按照流的類型可以分為:字節流和字符流
- 字節流 :以字節為單位。
- 字符流 :以字符為單位。
字節流和字符流的超類如下所示
| 字節流 | InputStream | OutputStream |
| 字符流 | Reader | Writer |
字節流和字符流不同之處
- 讀寫單位不同:字節流以字節(8bit)為單位,字符流以字符為單位,根據碼表映射字符,一次可能讀多個字節。
- 處理對象不同:字節流能處理所有類型的數據(如圖片、視頻、音頻等),而字符流只能處理字符類型的數據。
總結:只要是處理純文本數據,就優先考慮使用字符流。 除此之外都使用字節流
字節流和字符流實現類匯總
二、字節輸入輸出流
一切文件數據(文本、圖片、視頻等)在存儲時,都是以二進制數字的形式保存,都一個一個的字節,那么傳輸時一樣如此。所以,字節流可以傳輸任意文件數據。
1、字節輸入流(InputStream)
InputStream抽象類字節輸入流的所有類的超類,可以讀取字節信息到內存中。它定義了字節輸入流的基本共性功能方法。
1、public abstract int read();
2、 public void close();
3、public long skip(long n);
4、public synchronized void mark(int readlimit);
5、public synchronized void reset();
我們以FileInputStream讀取文件為例
FileInputStream讀取字節數據
test.txt文件內容為:123123123
1、讀取字節:read方法,每次可以讀取一個字節的數據,提升為int類型,讀取到文件末尾,返回-1,代碼如下:
2、使用字節數組讀取:read(byte[] b),每次讀取b的長度個字節到數組中,返回讀取到的有效字節個數,讀取到末尾時,返回-1 ,代碼如下:
public static void testFileInPut1()throws Exception {FileInputStream inputStream = new FileInputStream("D:\\aplus\\test.txt");int b;byte[] bytes = new byte[2];while ((b = inputStream.read(bytes)) != -1) {System.out.println(b);System.out.println("======");System.out.println(new String(bytes));}inputStream.close();}輸出結果:
12
31
23
12
32
我們發現結果不正確,最后一個為啥事32,這是由于最后一次讀取時,只讀取一個字節3,數組中,上次讀取的數據沒有被完全替換,所以要通過len ,獲取有效的字節。
每次讀取后,把數組的有效字節部分,變成字符串打印
代碼改造如下:
2、字節輸出流(OutputStream)
.OutputStream抽象類輸出流是所有類的超類(父類),將指定的字節信息寫出到目的地。定義了字節輸出流公共方法。
1、public abstract void write(int b)
2、public void write(byte b[])
3、public void write(byte b[], int off, int len)
4、 public void flush()
5、public void close()
我們以FileOutputStream寫出文件為例
使用FileOutputStream寫出字節數據主要通過Write方法,而write方法分如下三種
1、write(int b)每次寫出一個字節數據,代碼如下:
public static void testFileOutPut()throws Exception {FileOutputStream outputStream = new FileOutputStream("D:\\aplus\\out.txt");outputStream.write(98);outputStream.write(99);outputStream.flush();outputStream.close();}2、寫出字節數組:write(byte[] b),每次可以寫出數組中的數據,代碼如下:
public static void testFileOutPut1()throws Exception {FileOutputStream outputStream = new FileOutputStream("D:\\aplus\\out.txt");byte[] b = "我是java高手".getBytes();outputStream.write(b);outputStream.close();}3、寫出指定長度字節數組:write(byte[] b, int off, int len) ,每次寫出從off索引開始,len個字節,代碼如下:
public static void testFileOutPut2()throws Exception {FileOutputStream outputStream = new FileOutputStream("D:\\aplus\\out.txt");byte[] b = "java".getBytes();outputStream.write(b,0,2);outputStream.close();}FileOutputStream實現數據追加續寫
FileOutputStream提供了一個構造函數FileOutputStream(File file, boolean append),當boolean為true時表示追加數據。
3、文件拷貝
上面已經詳細介紹了字節輸入和輸出流,我們現在做一個例子實現圖片的拷貝。
上面的寫法不規范,下面我們寫一個規范的文件拷貝,代碼如下:
三、處理流和轉換流
處理流和節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。
常用的處理流
- 緩沖流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加緩沖功能,避免頻繁讀寫硬盤。
- 轉換流:InputStreamReader 、OutputStreamReader實現字節流和字符流之間的轉換。
- 數據流: DataInputStream 、DataOutputStream 等-提供將基礎數據類型寫入到文件中,或者讀取出來。
———————————————————————————————————
***由于本人水平有限,難免有不足,懇請各位大佬不吝賜教!
總結
以上是生活随笔為你收集整理的一篇文章教你学会Java基础I/O流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇文章教你弄懂java CMS垃圾回收
- 下一篇: 一篇文章教你学会Java泛型