20 (IO,檔案拷貝)
阿新 • • 發佈:2018-12-13
1 IO流
2 FileInputStream
重要方法read(),每次讀取一個位元組,返回值為int。
當沒有位元組的時候,會返回-1,所以檔案的結束標記是-1,那麼會出現一個新的問題,read()為什麼返回int值呢?
而不是返回byte呢?是這樣的,如果是byte,萬一檔案中儲存了-1,程式會錯誤的以為檔案已經結束了,所以它返回的時候前面補上24個0。
3 FileOutputStream
FileOutputStream在建立物件的時候會清空檔案內的內容,再寫進去。
追加:可以在構造時設定追加為true
4 拷貝圖片
問題:當拷貝大檔案時,效率很低
開發推薦:標準格式
5 BufferedInputStream和BufferedOutputStream
他們是對InputStream和OutputStream的包裝,使得他們更加強大,運用緩衝區大小8192,提高效率,每次讀取8192到緩衝區。緩衝區積累8192,使得效率很高。
flush和close,一個是重新整理之後還可以用流,一個是重新整理之後關閉流。
6 位元組流讀取中文的問題
一箇中文等於兩個位元組。所以會出現讀取半個位元組的問題。
寫中文可以寫,但是需要將字串.getBytes()轉換為字元陣列來寫。
7 異常處理模板
jdk1.6版本
package com.haidai.IO; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo1 { public static void main(String[] args) throws IOException { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("xxx.txt"); fos = new FileOutputStream("yyy.txt"); int len; while ((len = fis.read()) != -1) { fos.write(len); } } finally { if (fis != null || fos != null) { fis.close(); fos.close(); } } } }
jdk1.7版本(自動關閉流)
package com.haidai.IO; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo2 { public static void main(String[] args) throws IOException { try ( FileInputStream fis = new FileInputStream("xxx.txt"); FileOutputStream fos = new FileOutputStream("yyy.txt"); ) { int len; while ((len = fis.read()) != -1) { fos.write(len); } } } }
8 圖片加密
異或的特點。