java I/O流詳解

來源:互聯網
上載者:User

標籤:轉換流   dem   readline   .com   main   utf-8   obj   while   目錄   

概況

I/O流主要分為二大類別:字元流和位元組流。

位元組流(基本流)

1、位元組輸入資料流    類名:FileInputStream    特點:讀(對檔案進行讀取操作)    父類:InputStream   

2、位元組輸出資料流    類名:FileOutputStream 特點:寫 (對檔案進行寫入操作)    父類:OutputStream

字元流(基本流)

1、字元輸入資料流    類名:FileReader   特點:讀(對檔案進行讀取操作)     父類:InputStreamReader  

2、字元輸出資料流    類名:FileWriter       特點:寫 (對檔案進行寫入操作)    父類:OutputStreamWriter

緩衝流位元組緩衝流

1、緩衝位元組輸入資料流  類名:BufferedInputStream    特點:讀(對檔案進行讀取操作)  父類:FilterInputStream

2、緩衝位元組輸出資料流  類名:BufferedOutputStream  特點:寫 (對檔案進行寫入操作)  父類:FilterOutputStream

字元緩衝流

1、緩衝字元輸入資料流  類名:BufferedReader    特點:讀(對檔案進行讀取操作)  父類:Reader   (基本輸入資料流多了readLine()一次讀取一行方法)

2、緩衝字元輸出資料流  類名:BufferedWriter      特點:寫 (對檔案進行寫入操作)  父類:Writer    (比基本輸出資料流多了newLine() 換行方法)

轉換流

1、InputStreamReader     特點:讀 (對檔案進行讀取操作) 輸入資料流    父類:Reader

2、OutputStreamWriter    特點:寫 (對檔案進行寫入操作) 輸出資料流    父類:Writer

列印流

1、PrintStream        特點:寫 (對檔案進行寫入操作)     底層:基本位元組流

2、PrintWriter          特點:寫 (對檔案進行寫入操作)     底層:基底字元流

基本位元組流和基底字元流的區別:

1、位元組流可以讀寫任何檔案      字元流只能讀取普通檔案

2、讀寫文字檔盡量使用字元流   這要比位元組流效率高

3、讀寫媒體檔案用位元組流

4、基本位元組流沒有緩衝區

5、基底字元流有緩衝區  預設大小為8k (不能指定緩衝區大小)

6、位元組流是一個一個位元組讀  效率比較低  雖然可以讀取各種各樣的檔案但是 最適用於讀取媒體檔案

7、字元流是一個一個字元讀 效率比較高

緩衝流和基本流的區別:

1、緩衝流效率要高於基本流

2、緩衝字元流彌補了基底字元流不能設定緩衝區大小的缺口

3、緩衝位元組流和基本位元組流相比   建議使用基本位元組流

4、緩衝字元流和基底字元流相比  建議使用緩衝字元流

轉換流的作用

轉換流的作用主要是解決在進行讀寫操作時出現的中文亂碼  (java預設處理檔案時是gbk  當將文字檔儲存為utf-8的時候 進行讀寫操作就會出現中文亂碼)

//用轉換流讀寫OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"), "utf-8");osw.write("中國");osw.close();InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"utf-8");char[] cc = new char[10];isr.read(cc);String ss = new String(cc);System.out.println(ss);isr.close();
 API圖

用法總結:

1、多媒體類    用位元組流

讀:基本位元組輸入資料流

寫:基本位元組輸出資料流

2、檔案檔案   用字元流

讀:建議用字元緩衝輸入資料流

寫:建議用字元緩衝輸出資料流    如果寫的資料多種多樣的建議用列印流(PrintStream、PrintWriter)

3、比較明顯意圖的資料流

讀寫對象只能用物件流程(ObjectInputStream、ObjectOutputStream)

如果在讀寫檔案的過程中遇到中文亂碼只能用轉換流(InputStreamReader、OutputStreamWriter)

簡單一實例:

 複製較小檔案代碼:

//複製較小檔案//先讀後寫   讀的時候檔案必須存在 不會自動建立  寫的時候檔案可以不存在會自動建立File f = new File("D:\\practice\\backend\\a.txt");FileInputStream fis = new FileInputStream(f);byte[] b = new byte[(int)f.length()]; fis.read(b);fis.close();//寫FileOutputStream fos = new FileOutputStream("D:\\practice\\backend\\b.txt");//不存在會自動建立fos.write(b);fos.close();

 複製較大檔案代碼:

//讀取複製大檔案//一邊讀一邊寫FileInputStream fis = new FileInputStream("D:\\practice\\backend\\hello.mp4");//不存在不會自動建立FileOutputStream fos = new FileOutputStream("D:\\practice\\backend\\h.mp4");//不存在會自動建立byte[] b = new byte[1024*1024];//每次讀取1Mwhile(true){int len = fis.read(b);System.out.println(len);if(len == -1){break;//當傳回值是-1  證明檔案已經讀取完  終止迴圈}fos.write(b, 0, len);}fis.close();fos.close();

 利用遞迴尋找某個目錄下的視頻檔案

public class Demo7 {public static void findAvi(String pathName){File ff = new File(pathName);File[] fss = ff.listFiles();for (File fa : fss) {if(fa.isFile()){//判斷是否是檔案if(fa.getName().endsWith(".mp4")){//判斷是否是視頻檔案System.out.println(fa);}}else{findAvi(fa.getPath());}}}public static void main(String[] args) {//遞迴尋找某個目錄下的視頻檔案//E:\迅雷下載String ss = "E:\\迅雷下載";findAvi(ss);//靜態方法只能訪問靜態方法}}

 

java I/O流詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.