java筆記IO流(一)之位元組流
1.概念
* IO流用來處理裝置之間的資料傳輸
* Java對資料的操作是通過流的方式
* Java用於操作流的類都在IO包中
* 流按流向分為兩種:輸入流,輸出流。
* 流按操作型別分為兩種:
* 位元組流 : 位元組流可以操作任何資料,因為在計算機中任何資料都是以位元組的形式儲存的
* 字元流 : 字元流只能操作純字元資料,比較方便。2.IO流常用父類
* 位元組流的抽象父類:
* InputStream
* OutputStream
* 字元流的抽象父類:
* Reader
* Writer
3.IO程式書寫
* 使用前,匯入IO包中的類
* 使用時,進行IO異常處理
* 使用後,釋放資源
通過fileinputstream和fileoutStream來進行檔案的輸入輸出
public static void main(String[] args) throws IOException { FileInputStream fiS =new FileInputStream("xxx.txt"); FileOutputStream foS = new FileOutputStream("yyy.txt"); byte[] arr = new byte[1024*8]; int len; System.out.println("................."); while ((len=fiS.read(arr))!=-1) {//若少寫了arr就會,就會把讀入的符號的碼錶值當作數值。 for (byte b : arr) { foS.write(arr); } } fiS.close(); foS.close(); } //該寫法既不會造成記憶體溢位,也不會使得每一次都一個個位元組的輸入輸出,造成傳輸速度慢
IO流(BufferedInputStream和BufferOutputStream拷貝)
A:緩衝思想
* 位元組流一次讀寫一個數組的速度明顯比一次讀寫一個位元組的速度快很多,
* 這是加入了陣列這樣的緩衝區效果,java本身在設計的時候,
* 也考慮到了這樣的設計思想(裝飾設計模式後面講解),所以提供了位元組緩衝區流B.BufferedInputStream
* BufferedInputStream內建了一個緩衝區(陣列)
* 從BufferedInputStream中讀取一個位元組時
* BufferedInputStream會一次性從檔案中讀取8192個, 存在緩衝區中, 返回給程式一個
* 程式再次讀取時, 就不用找檔案了, 直接從緩衝區中獲取
* 直到緩衝區中所有的都被使用過, 才重新從檔案中讀取8192個
C.BufferedOutputStream
* BufferedOutputStream也內建了一個緩衝區(陣列)
* 程式向流中寫出位元組時, 不會直接寫到檔案, 先寫到緩衝區中
* 直到緩衝區寫滿, BufferedOutputStream才會把緩衝區中的資料一次性寫到檔案裡
D.拷貝的程式碼
FileInputStream fis = new FileInputStream("致青春.mp3"); //建立檔案輸入流物件,關聯致青春.mp3
BufferedInputStream bis = new BufferedInputStream(fis); //建立緩衝區對fis裝飾
FileOutputStream fos = new FileOutputStream("copy.mp3"); //建立輸出流物件,關聯copy.mp3
BufferedOutputStream bos = new BufferedOutputStream(fos); //建立緩衝區對fos裝飾
int b;
while((b = bis.read()) != -1) {
bos.write(b);
}
bis.close(); //只關裝飾後的物件即可
bos.close();
E.小陣列的讀寫和帶Buffered的讀取哪個更快?
* 定義小陣列如果是8192個位元組大小和Buffered比較的話
* 定義小陣列會略勝一籌,因為讀和寫操作的是同一個陣列
* 而Buffered操作的是兩個陣列
IO流(flush和close方法的區別)
* flush()方法
* 用來重新整理緩衝區的,重新整理後可以再次寫出
* close()方法
* 用來關閉流釋放資源的的,如果是帶緩衝區的流物件的close()方法,不但會關閉流,還會再關閉流之前重新整理緩衝區,關閉後不能再寫出
###20.13_IO流(位元組流讀寫中文)
* 位元組流讀取中文的問題
* 位元組流在讀中文的時候有可能會讀到半個中文,造成亂碼
* 位元組流寫出中文的問題
* 位元組流直接操作的位元組,所以寫出中文必須將字串轉換成位元組陣列
* 寫出回車換行 write("\r\n".getBytes());
IO流(flush和close方法的區別)
* flush()方法
* 用來重新整理緩衝區的,重新整理後可以再次寫出
* close()方法
* 用來關閉流釋放資源的的,如果是帶緩衝區的流物件的close()方法,不但會關閉流,還會再關閉流之前重新整理緩衝區,關閉後不能再寫出
###20.13_IO流(位元組流讀寫中文)
* 位元組流讀取中文的問題
* 位元組流在讀中文的時候有可能會讀到半個中文,造成亂碼
* 位元組流寫出中文的問題
* 位元組流直接操作的位元組,所以寫出中文必須將字串轉換成位元組陣列
* 寫出回車換行 write("\r\n".getBytes());
IO流(流的標準處理異常程式碼1.6版本及其以前)
* try finally巢狀 :能關一個儘量關一個。
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("aaa.txt");
fos = new FileOutputStream("bbb.txt");
int b;
while((b = fis.read()) != -1) {
fos.write(b);
}
} finally {
try {
if(fis != null)
fis.close();
}finally {
if(fos != null)
fos.close();
}
}
//IO流(流的標準處理異常程式碼1.7版本)
* try close
try(
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt");
MyClose mc = new MyClose();
){
int b;
while((b = fis.read()) != -1) {
fos.write(b);
}
}
// 原理
// * 在try()中建立的流物件必須實現了AutoCloseable這個介面,如果實現了,在try後面的{}(讀寫程式碼)執行//後就會自動呼叫,流物件的close方法將流關掉