java基礎筆記之IO流:

知識點:
IO流:
概述:用來傳輸數據的
// 內存和硬盤之間進行數據交互的
分類:
流向:
輸入流:讀取數據
輸出流:寫數據
操作:
字節流:可以操作任意類型的數據,但是操作中文可能會出現亂碼
字符流:專門用來操作純文本文件
字節流的常用抽象父類:
InputStream:字節輸入流.
繼承類:
FileInputStream:
構造方法:
public FileInputStream(String name);
public FileInputStream(File file);
成員方法:
available(); //瞭解即可. 獲取到要讀取的文件的 所有字節數
read():一次讀一個字節,讀不到返回-1,讀到就返回對應的碼值
read(byte[] bys):一次讀一個數組,讀不到返回-1,讀到就返回有效字節數,返回值:int
FileInputStream fls =newFileInputStream(放一個文件路徑(file是一個封裝路徑的對象));
//int x = fls.read();從硬盤上讀取一個字節
一般這樣寫:
int b;
while((b.read())!=-1){
system.out.println(b);
}
fls.close();關閉釋放資源
文件結束標記是-1;
BufferedInputStream(字節緩衝輸入流/字節高效輸入流):封裝的是普通流
OutputStream:字節輸出流
繼承類:
FileOutputStream:創建對象時,如果沒有就會幫我們創建出來,如果有了,就會把文件清空,再寫入數據
構造方法: //如果文件不存在,會自動創建.
public FileOutputStream(String name);
public FileOutputStream(File file);

public FileOutputStream(String name,boolean append);//往文件中追加數據
public FileOutputStream(File file,boolean append);
成員方法:
write(int a):
write(byte[] bys);
write(byte[] bys,int index,int len);
BufferedOutputStream: //字節緩衝輸出流(字節高效輸出流)
代碼:
FileOutputStream fos = new FileOutputStream(放文件路徑,如果沒有就自己創建,boolean append//默認是false,不會在後面追加,只會覆蓋,改成true就會續寫);//創建字節流輸出流對象,沒有就自動創建
fos.write(內容);
fos.close()

字節流操作中文的問題:
讀取中文: 可能會讀取到中文的半個字節,造成亂碼.
寫出中文: 需要將中文轉換成其對應的 字節數組,然後再寫出.getbyte()




字符流的常見抽象父類:
Reader:字符輸入流
Writer:字符輸出流

拷貝圖片

定義一個小數組來拷貝文件(推薦) 字節流一次讀寫一個指定長度的字節數組.
FileInputStream fis = new FileInputStream("ss.jpg");//創建輸入流對象,封裝的是數據源
FileOutputStream fis = new FileOutputStream("copy.jpg");//創建輸出流,封裝的的是目的地
byte[] arr = new byte[長度,一般是1024的整數倍];
int len ;
while((len=fis.read(arr))!=-1){//如果忘記加arr,返回的就不是字節個數了,而是字節碼的值,
fos.rea(arr,0,len//有效的字節數);

}
fis.close();//關閉釋放資源
fos.close()

代碼:第一種拷貝
FileInputStream fis = new FileInputStream("ss.jpg");//創建輸入流對象
FileOutputStream fis = new FileOutputStream("copy.jpg");//創建輸出流
int b;
while((b=fis.read())!=-1){//不斷讀取每個字節
fos.write(b);//逐個字節拷貝
}
fis.close();//關閉釋放資源
fos.close()

//fis.available獲取文件大小(不推薦)




IO流的核心代碼:
1: 創建輸入流對象,封裝數據源文件.
2: 創建輸出流對象,封裝目的地文件.
3: 定義變量,用來記錄讀取到的內容(或者是有效字節(符)數).
4: 定義循環開始讀取,只要條件滿足就一直讀.
5: 將讀取到的內容寫入到目的地文件中.
6: 關閉關閉輸入流對象和輸出流對象.








面試題:
記憶:
1.集合的頂層都是接口,IO流是抽象類
2. 普通流封裝的是文件,高效流封裝的是普通流
3: 在try(){}格式中,寫在小括號中的代碼會在大括號中的代碼執行完畢後,自動釋放.
前提是: 必須實現 AutoCloseable 接口.

1.read()方法讀取一個字節,爲什麼返回int,而不是byte?
防止中間出現11111111(-1的補碼),這樣的數據,後面的數據就讀取不了啦
2: 字節緩衝流的內置緩衝區大小是多少?
8192個字節.
3.close() 和flush() 方法的區別?
* flush()方法:
具備刷新的功能,用來刷新緩衝區的,刷新之後,流對象可以繼續使用.
* close()方法:
     * 具備刷新的功能,用來關閉流,釋放資源的,在關閉流之前,會刷新一次緩衝區,關閉時候,流對象不可以繼續使用.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章