javaSE (二十九)IO.read()輸出是int的原因、fileoutputstream的追加功能、用byte[]優化拷貝檔案、Buffered緩衝區記憶體示意圖
IO流比collection簡單很多,方法也很少所以寫的有點雜,可直接看api
1、IO.read()輸出是int的原因:
fileinputstream: 檔案輸入流 檔案位元組輸入到jvm
fileoutputstream: 檔案輸出流 jvm輸出到檔案
答:因為位元組輸入流可以操縱任意型別的檔案,比如圖片音訊等,底層都是以二進位制形式儲存的,如果每次都返回buye,有可能讀到中間的時候會遇到11111111,這個是byte型別的-1,遇到-1就不讀取了,所以要用int型別接受,在11111111前面補上24個0湊足4個位元組,那麼byte的-1就變成了int型別的255,00000000 00000000 00000000 11111111 可以保證整個資料都讀完,結束標記就是int型別的-1,而輸出流的write方法會把前面的24個0去掉
2、fileoutputstream的追加功能:
fileoutputstream在建立物件的時候,如果沒有這個檔案,就會建立一個,如果有,會將原來的清空,而構造方法:FileOutputStream(String name, boolean append) 可追加
3、用位元組陣列byte[]優化拷貝檔案:
arr是一個緩衝區,就像大巴運人,一開始都是荷載,一輛一輛地帶走,到最後沒人了,返回-1,運了半車人,然後運走
package cn.njupt;
import java.io.File;
import java.io.FileInputStream;
import java. io.FileOutputStream;
import java.io.IOException;
public class file {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("111.jpg");
FileOutputStream out = new FileOutputStream("copy.jpg");
byte[] arr = new byte[1024*8];
int len;
while ((len = in.read(arr)) != -1) { //arr是一個緩衝區,就像大巴運人,一開始都是荷載,一輛一輛地帶走,到最後沒人了,返回-1,運了半車人,然後運走
out.write(arr, 0, len);
}
in.close();
out.close();
}
}
4、Buffered緩衝區記憶體示意圖:
1. 開發中用byte[]陣列搭配out.write(arr, 0, len)方法和用bufferedInputStream緩衝區都可以,緩衝區簡便一點
2. 加了緩衝區後,關流只需要關緩衝區就可以了
注意:
close() 方法可以重新整理緩衝區,就是將最後一次緩衝區裡面的資料輸出,
flush() 也有重新整理的功能(可以每次運輸都重新整理一下,但是close()重新整理後就結束程式不能繼續了,就像QQ聊天,每次重新整理後還能繼續聊天)