(一)含義html
IO:Java對數據的操做是經過流的方式,IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java用於操做流的對象都在IO包中。java
(二)分類數組
(三)用法緩存
3.1 字節文件操做流編輯器
FileInputStream:字節文件輸入流,從文件系統中的某個文件中得到輸入字節,用於讀取諸如圖像數據之類的原始字節流。測試
讀取文件的兩種方式spa
方式一:一次讀取一個字節.net
// 讀取f盤下該文件f://hell/test.txt //構造方法1 InputStream inputStream = new FileInputStream(new File("f://hello//test.txt")); int i = 0; //一次讀取一個字節 while ((i = inputStream.read()) != -1) { // System.out.print(i + " ");// 65 66 67 68 //爲何會輸出65 66 67 68?由於字符在底層存儲的時候就是存儲的數值。即字符對應的ASCII碼。 System.out.print((char) i + " ");// A B C D } //關閉IO流 inputStream.close();
方式二:一次讀取一個字節數組code
// 讀取f盤下該文件f://hell/test.txt //構造方法2 InputStream inputStream2 = new FileInputStream("f://hello/test.txt"); // 字節數組 byte[] b = new byte[2]; int i2 = 0; // 一次讀取一個字節數組 while ((i2 = inputStream2.read(b)) != -1) { System.out.print(new String(b, 0, i2) + " ");// AB CD } //關閉IO流 inputStream2.close();
注: 一次讀取一個字節數組,提升了操做效率,IO流使用完畢必定要關閉。視頻
FileOutputStream:字節文件輸出流是用於將數據寫入到File,從程序中寫入到其餘位置。
將數據寫入到文件
OutputStream outputStream = new FileOutputStream(new File("test.txt")); // 寫入數據 outputStream.write("ABCD".getBytes()); // 關閉IO流 outputStream.close(); // 內容追加寫入 OutputStream outputStream2 = new FileOutputStream("test.txt", true); // 輸出換行符 outputStream2.write("\r\n".getBytes()); // 輸出追加內容 outputStream2.write("hello".getBytes()); // 關閉IO流 outputStream2.close();
注:輸出的目的地文件不存在,則會自動建立,不指定盤符的話,默認建立在項目目錄下;輸出換行符時必定要寫\r\n不能只寫\n,由於不一樣文本編輯器對換行符的識別存在差別性。
3.2 字節緩衝流(高效流)
BufferedInputStream:字節緩衝輸入流,提升了讀取效率。
InputStream in = new FileInputStream("test.txt"); // 字節緩存流 BufferedInputStream bis = new BufferedInputStream(in); byte[] bs = new byte[20]; int len = 0; while ((len = bis.read(bs)) != -1) { System.out.print(new String(bs, 0, len)); // ABCD // hello } // 關閉流 bis.close();
BufferedOutputStream:字節緩衝輸出流,提升了寫出效率。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true)); // 輸出換行符 bos.write("\r\n".getBytes()); // 輸出內容 bos.write("Hello Android".getBytes()); // 刷新此緩衝的輸出流 bos.flush(); // 關閉流 bos.close();
3.3 高效流效率比對
測試:讀取f盤下的一個視頻文件到項目中:文件大小29.5 MB
方式一:
FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4"); FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4"); int len; // 開始時間 long begin = System.currentTimeMillis(); // 一次讀取一個字節 while ((len = inputStream.read()) != -1) { outputStream.write(len); } // 用時毫秒 System.out.println(System.currentTimeMillis() - begin);// 213195 //關閉流釋放資源 inputStream.close(); outputStream.close();
方式二:
FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4"); FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4"); int len; byte[] bs = new byte[1024]; // 開始時間 long begin = System.currentTimeMillis(); // 一次讀取一個字節數組 while ((len = inputStream.read(bs)) != -1) { outputStream.write(bs, 0, len); } // 用時毫秒 System.out.println(System.currentTimeMillis() - begin);// 281 inputStream.close(); outputStream.close();
方式三:
InputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4"); BufferedInputStream bis = new BufferedInputStream(inputStream); OutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4"); BufferedOutputStream bos = new BufferedOutputStream(outputStream); int len; byte[] bs = new byte[1024]; // 開始時間 long begin = System.currentTimeMillis(); while ((len = bis.read(bs)) != -1) { bos.write(bs, 0, len); } // 用時毫秒 System.out.println(System.currentTimeMillis() - begin);// 78 bis.close(); bos.close();
注:由此能夠看出高效緩衝流讀寫速度是很是快的,建議使用。
實戰,請移步文章:servlet實現文件上傳,預覽,下載和刪除
UpdateTime--2017年9月7日14:14:06
通用說明:
a.流的表現形式爲int類型的數值,即字符對應的ASCII碼,能夠強轉爲單字符;
b.字節輸入流InputStream是將文件轉換成流,想要獲取輸入流中的數據須要調用read()方法;
FileInputStream fis = new FileInputStream(filePath);
若是文件不存在,會拋出異常
c.字節輸出流OutputStream是將文件轉換成流,想要往文件中輸入內容,需將內容轉換成byte數組,再調用write()方法;
FileOutputStream fis = new FileOutStream(filePath);
filePath能夠爲相對路徑,也能夠爲絕對路徑,推薦使用絕對路徑;
輸出的目的地文件不存在,則會自動建立,將文件轉換成流,只能寫入內容,須要調用write()方法,不能讀取內容;
當建立文件輸出流只傳入一個文件路徑參數時,形如:FileOutputStream fis = new FileOutStream(filePath);,調用fis.write(str.getBytes())時,原文件中的內容將會被覆蓋掉;
不想被覆蓋,只是追加內容,能夠傳入2個參數,形如:FileOutputStream fis = new FileOutStream(filePath, true);
輸出換行符時必定要寫\r\n不能只寫\n,由於不一樣文本編輯器對換行符的識別存在差別性。
2018/11/28
當調用write()方法時,必須聲明三個入參;
// 6.讀取目標文件,經過response將目標文件寫到客戶端 // 讀取文件 InputStream is = new FileInputStream(filePath); // 輸入緩衝流 BufferedInputStream bis = new BufferedInputStream(is); // 輸出文件 OutputStream os = response.getOutputStream(); // 輸出緩衝流 BufferedOutputStream bos = new BufferedOutputStream(os); // 寫文件 // 緩衝字節數 byte data[] = new byte[1024]; // 實際讀取字節數 int n; while ((n = bis.read(data)) != -1) { bos.write(data,0,n); // 錯誤方式 // bos.write(n); } // 關閉流 bis.close(); // 清空輸出緩衝流 bos.flush(); bos.close();
若是隻聲明一個入參,寫入文件裏的內容會錯誤!
// 寫文件 // 緩衝字節數 byte data[] = new byte[1024]; // 實際讀取字節數 int n; while ((n = bis.read(data)) != -1) { // 錯誤方式 bos.write(n); }