-
int read() :
1.從讀取流讀取的是一個一個字節
2.返回的是字節的(0-255)內的字節值
3.讀一個下次就自動到下一個,如果碰到-1說明沒有值了.
- int read(byte[] b) :
int len = read(arr);如果文件上有數據返回的就是讀到有效的字節個數,如果文件上沒有數據返回的就是-1
- int available():(慎用)
1.返回從該輸入流中可以讀取(或跳過)的字節數的估計值,而不會被下一次調用此輸入流的方法阻塞。
2.這個方法可以在讀寫操作前先得知數據流里有多少個字節可以讀取,需要注意的是,如果這個方法用在從本地文件讀取數據時,一般不會遇到問題。
3這是因為網絡通訊往往是間斷性的,一串字節往往分幾批進行發送。如果是用於網絡操作,會出現問題
4.如果到達輸入流末尾,則返回 0。
拷貝文件
- 逐個字節拷貝
1 FileInputStream fis = new FileInputStream("致青春.mp3"); //創建輸入流對象,關聯致青春.mp3 2 FileOutputStream fos = new FileOutputStream("copy.mp3"); //創建輸出流對象,關聯copy.mp3 3 4 int b; 5 while((b = fis.read()) != -1) { //將每次讀到的賦值給b 6 fos.write(b); //將b中的字節寫出去 7 } 8 9 fis.close(); //關流,釋放資源 10 fos.close();
- 自定義數組拷貝
1 FileInputStream fis = new FileInputStream("致青春.mp3"); //創建輸入流對象,關聯致青春.mp3 2 FileOutputStream fos = new FileOutputStream("copy.mp3"); //創建輸出流對象,關聯copy.mp3 3 byte[] arr = new byte[1024 * 8]; //自定義數組 4 int len; 5 while((len = fis.read(arr)) != -1) { //將數據讀到字節數組中 6 fos.write(arr, 0, len); //從字節數組中將數據寫到文件上 7 //fos.write(arr); 8 } 9 10 fis.close(); //關流,釋放資源 11 fos.close(); 12 13 int len = read(arr);如果文件上有數據返回的就是讀到有效的字節個數,如果文件上沒有數據返回的就是-1
- 定義一個大數組拷貝,數組和文件的字節個數一樣大
1 //fis.available();一次獲取讀的文件的大小 2 FileInputStream fis = new FileInputStream("致青春.mp3"); 3 FileOutputStream fos = new FileOutputStream("copy.mp3"); 4 byte[] arr = new byte[fis.available()]; //雖然可以拷貝,但是在開發時不建議,有可能會導致內存溢出 5 fis.read(arr); 6 fos.write(arr); 7 fis.close();
- 帶緩沖區的拷貝
1 FileInputStream fis = new FileInputStream("致青春.mp3"); //創建輸入流對象,關聯致青春.mp3 2 BufferedInputStream bis = new BufferedInputStream(fis); //對fis進行包裝,內置一個8192大小的字節數組 3 FileOutputStream fos = new FileOutputStream("copy.mp3"); //創建輸出流對象,關聯copy.mp3 4 BufferedOutputStream bos = new BufferedOutputStream(fos); //對fos進行包裝,內置一個8192大小的字節數組 5 6 int b; 7 while((b = bis.read()) != -1) { //read一次會先將文件上的數據讀到緩沖區中,再從緩沖區一個一個的賦值給b 8 bos.write(b); //write一次,是將b中的字節數據寫到緩沖區,緩沖區寫滿再一次寫到文件上 9 } 10 11 bis.close(); //只需要關掉包裝后的即可 12 bos.close();