InputStream和OutputStream
阿新 • • 發佈:2018-11-13
位元組輸入流和位元組輸出流:
/* * 位元組輸入流和位元組輸出流可以操作任何檔案 但是是以位元組讀取檔案 * read()讀取的是一個位元組,為什麼返回int,而不是byte * * 因為讀到中間可能遇到11111111(8個1),這11111111表示byte型別的-1,就不會讀取後面的資料了, * 所以讀取的時候用int接受將11111111在前面添16個0,補足24位,那麼byte型別的-1就變成了int的255, * 就可以保證資料讀完,而結束的標記-1就是int型 */ @Test public void demo() throws Exception{ //"xx01.txt"表示當前專案路徑下的檔案,xxx.txt必須存在,要不就會報錯 FileInputStream file=new FileInputStream("xx01.txt"); //建立流物件 int b; while ((b=file.read())!= -1){ //檔案結束的標誌是-1,,read()函式自動指向下一位 System.out.println(b); } file.close(); //關流釋放資源 } //上面輸出97 98 99 /* * FileOutputStream 在new的時候,若檔案不存在,就建立一個, * 若存在先將檔案清空;如果想續寫就 new FileOutputStream("yyy.txt",true); */ @Test public void demo2() throws Exception{ //保證路徑存在即可,檔案不存在就會建立一個 FileOutputStream file = new FileOutputStream("yyy.txt"); file.write(97); file.write(98); file.close(); }
- 檔案的拷貝(效率較慢):以下程式碼是一個位元組一個位元組讀取,再一個位元組一個位元組寫入,效率較慢,
/* * IO流的核心程式碼,讀取一個檔案內容,寫入另一個檔案 */ @Test public void demo3() throws Exception{ FileInputStream fis=new FileInputStream("xx01.txt"); //檔案可以是txt,照片.jpg 或者其他 FileOutputStream fos = new FileOutputStream("yyy.txt"); int b; while ((b=fis.read())!= -1){ fos.write(b); } fis.close(); fos.close(); }
- 檔案的拷貝(效率你上一個快,但不推薦使用,容易記憶體溢位):將檔案一次性讀取到位元組陣列中,在一次性寫入按時
/* * IO流的核心程式碼,一次性讀取一個檔案內容,再全部寫入另一個檔案 */ @Test public void demo4() throws Exception { FileInputStream fis = new FileInputStream("xx01.txt"); //檔案可以是txt,照片.jpg 或者其他 FileOutputStream fos = new FileOutputStream("yyy.txt"); byte[] file = new byte[fis.available()]; //建立一個與檔案一樣大小的位元組陣列 fis.read(file); //將檔案的內容全部讀取到位元組陣列中 fos.write(file); //將位元組陣列的內容寫入到另一個檔案中 fis.close(); fos.close(); }
- 標準的拷貝格式(定義小陣列):
/* * 定義小陣列的標準格式,一般長度是1024的整數倍 */ @Test public void demo5() throws Exception { FileInputStream fis = new FileInputStream("xx01.txt"); //檔案可以是txt,照片.jpg 或者其他 FileOutputStream fos = new FileOutputStream("yyy.txt"); byte[] file = new byte[1024 * 8]; //防止記憶體溢位 int len; //表示新讀取的位元組長度,保證不會重複 while ((len=fis.read(file))!=-1){ //忘記加file,返回的不是位元組個數,而是位元組的碼錶值 fos.write(file,0,len); } fis.close(); fos.close(); }
-
緩衝區實現
/* * BufferedInputStream和BufferedOutputStream * 位元組流緩衝區 */ @Test public void demo6() throws Exception { FileInputStream fis = new FileInputStream("xx01.txt"); //穿件檔案輸入流物件 BufferedInputStream bfis=new BufferedInputStream(fis); //建立緩衝區對fis修飾,預設建立byte[8192]陣列 FileOutputStream fos = new FileOutputStream("yyy.txt"); BufferedOutputStream bfos=new BufferedOutputStream(fos); int b; while ((b=bfis.read())!=-1){ bfos.write(b); } bfis.close(); bfos.close(); }
JDK1.7新特性
/* * 異常處理,JDK1.7版本的新特性 */ @Test public void demo7()throws Exception{ try( FileInputStream fis = new FileInputStream("xx01.txt"); //具有自動關閉的功能(繼承了Closeable),{}執行完之後,會自動將()裡的流關閉 FileOutputStream fos = new FileOutputStream("yyy.txt"); ){ int b; while ((b = fis.read()) != -1) { fos.write(b); } } }