標籤:轉換流 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流詳解