在java中,能夠從中讀入一個字節序列的對象叫作輸入流,而能夠向其中下入一個字節序列的對象稱做輸出流。這些字節序列的來源地和目的地一般是文件,但也能夠是網絡鏈接,甚至是內存塊。java
其餘編程語言的流類庫的緩衝機制和預覽細節等都是自動處理的。Java須要將多個流過濾器組合以構建真正有用的流序列能力,它有極大的靈活性。編程
緩衝區的做用是在輸入流、輸出流在寫入寫出時,不會每次都對設備進行訪問。當緩衝區爲空時,會讀入新的數據塊;當緩衝區滿或被Flush時,數據被寫出。數組
字節流能夠處理全部類型數據,如圖片、視頻等;字符流只能處理純文本網絡
讀取操做編程語言
一、Readerspa
(1)BufferedReader3d
從字符流中讀取文本,緩衝各個字符,實現高效率讀取。通常包裝FileReader、InputStreamReader等read開銷高的類,若沒有緩衝區,則read操做會讀取字節並轉換字符返回,效率低效。緩衝區的大小能夠指定,但通常默認夠用。code
(2)InputSreamReader視頻
是字節流通向字符流的橋樑,read方法在底層輸入流中轉換一個或多個字節,要想實現有效的轉換,外層需套上BufferedReader。它能夠指定字符集,不然使用平臺默認字符集。對象
(3)FileReader
用來讀取字符文件。
二、InputStream
(1)從文件中讀取原始字節流,能夠使文本、圖像、視頻等格式。
(2)BufferedInputStream
繼承FilterInputStream,提供緩衝輸入流功能,在建立BufferedInputStream時,會建立一個內部緩衝數組,默認爲8M。與FileInputStream相比,一樣的read方法,執行效率卻更快。
讀取操做用例
1 import java.io.BufferedInputStream; 2 import java.io.BufferedReader; 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.FileReader; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.InputStreamReader; 9 10 public class IO讀取用例 { 11 12 public static void main(String[] args) throws IOException { 13 // TODO Auto-generated method stub 14 15 BufferedReader br=null; 16 BufferedInputStream bis=null; 17 try { 18 //字符流 19 //讀取字符流時,只有BufferedReader擁有ReadLine()方法 20 //方式一:直接讀取 21 FileReader fr=new FileReader("test.txt"); //2848KB 22 br=new BufferedReader(fr); 23 24 long t=System.currentTimeMillis(); 25 if(br.ready()){ 26 while((br.readLine())!=null){ 27 //TODO: 28 } 29 } 30 t=System.currentTimeMillis()-t; 31 32 System.out.println("FileReader用時"+t);//50s 33 34 //方式二:原始字節流轉換讀取 35 InputStream in=new FileInputStream("test.txt"); 36 InputStreamReader isr=new InputStreamReader(in); //轉換 37 br=new BufferedReader(isr); 38 39 long t2=System.currentTimeMillis(); 40 if(br.ready()){ 41 while((br.readLine())!=null){ 42 //TODO: 43 } 44 } 45 t2=System.currentTimeMillis()-t2; 46 47 System.out.println("FileInputStream用時"+t2); //28s 48 49 //字節流 50 //方式一:流直接讀取 51 InputStream fis=new FileInputStream("test.txt"); 52 byte[] b=new byte[1024]; //存儲讀取數組 53 54 long t3=System.currentTimeMillis(); 55 if(fis.available()>0){ 56 while((fis.read(b))!=-1){ 57 //TODO: 58 } 59 } 60 t3=System.currentTimeMillis()-t3; 61 System.out.println("BufferedInputStream用時"+t3);//6s 62 63 //方式二:流套上buffered緩衝讀取 64 bis=new BufferedInputStream(new FileInputStream("test.txt")); 65 b=new byte[1024]; 66 67 long t4=System.currentTimeMillis(); 68 if(bis.available()>0){ 69 while((bis.read(b))!=-1){ 70 //TODO: 71 } 72 } 73 t4=System.currentTimeMillis()-t4; 74 System.out.println("BufferedInputStream用時"+t4);//3s 75 76 } catch (FileNotFoundException e) { 77 e.printStackTrace(); 78 } finally{ 79 br.close(); 80 bis.close(); 81 } 82 83 } 84 85 }
寫入操做
一、Writer
(1)BufferedWriter
寫入字符輸出流,緩衝字符。利用緩衝的包裝,能夠實現高效率的寫入。
(2)OutputStreamWriter
是寫入流中字符向字節轉換的橋樑
(3)FileWriter
用於寫入已過濾的字符流的抽象類
二、OutputStream
(1)FileOutputStream
文件輸出流是用於將圖像數據之類的原始字節流寫入File或FileDescriptor的輸出流。而字符流通常使用FileWriter
(2)BufferedOutputStream
緩衝的輸出流
寫入操做用例
1 import java.io.BufferedInputStream; 2 import java.io.BufferedOutputStream; 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileInputStream; 6 import java.io.FileNotFoundException; 7 import java.io.FileOutputStream; 8 import java.io.FileReader; 9 import java.io.FileWriter; 10 import java.io.IOException; 11 import java.io.OutputStreamWriter; 12 13 public class IO寫入用例 { 14 15 public static void main(String[] args) throws IOException { 16 17 BufferedReader br=null; 18 BufferedInputStream bis=null; 19 20 BufferedWriter bw=null; 21 BufferedOutputStream bos=null; 22 try { 23 FileReader fr=new FileReader("read.txt"); //51,420KB 24 br=new BufferedReader(fr); 25 String line; 26 //文本同條件寫入 27 28 //方式一 :FileWriter直接寫入 29 FileWriter fw=new FileWriter("write.txt"); 30 31 long t=System.currentTimeMillis(); 32 if(br.ready()){ 33 while((line=br.readLine())!=null){ 34 //TODO: 35 fw.write(line); 36 } 37 } 38 t=System.currentTimeMillis()-t; 39 40 System.out.println("BufferedWriter用時"+t);//910s 41 42 //方式二 :BufferedWriter緩衝包裝 43 br=new BufferedReader(fr); 44 bw=new BufferedWriter(new FileWriter("write.txt")); 45 46 long t2=System.currentTimeMillis(); 47 if(br.ready()){ 48 while((line=br.readLine())!=null){ 49 //TODO: 50 bw.write(line); 51 } 52 } 53 t2=System.currentTimeMillis()-t2; 54 55 System.out.println("BufferedWriter用時"+t2); //0s 56 57 //方式三:原始字節流轉換寫入 58 br=new BufferedReader(fr); 59 bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("write.txt"))); 60 61 long t3=System.currentTimeMillis(); 62 if(br.ready()){ 63 while((line=br.readLine())!=null){ 64 //TODO: 65 bw.write(line); 66 } 67 } 68 t3=System.currentTimeMillis()-t3; 69 70 System.out.println("BufferedWriter用時"+t3); //0s 71 72 //字節流 73 74 //方式一:流直接寫入 75 bis=new BufferedInputStream(new FileInputStream("read.txt")); 76 FileOutputStream fos=new FileOutputStream("write"); 77 byte[] b=new byte[10*1024]; 78 79 long t4=System.currentTimeMillis(); 80 if(bis.available()>0){ 81 while((bis.read(b))!=-1){ 82 //TODO: 83 fos.write(b); 84 } 85 } 86 t4=System.currentTimeMillis()-t4; 87 88 System.out.println("InputStream用時"+t4); //143s 89 90 //方式二:流套上緩衝寫入 91 bis=new BufferedInputStream(new FileInputStream("read.txt")); 92 b=new byte[10*1024]; //存儲讀取數組 93 bos=new BufferedOutputStream(new FileOutputStream("write.txt")); 94 95 long t5=System.currentTimeMillis(); 96 if(bis.available()>0){ 97 while((bis.read(b))!=-1){ 98 //TODO: 99 bos.write(b); 100 } 101 } 102 t5=System.currentTimeMillis()-t5; 103 104 System.out.println("InputStream用時"+t5); //137s 105 106 } catch (FileNotFoundException e) { 107 e.printStackTrace(); 108 } finally{ 109 br.close(); 110 bis.close(); 111 bw.close(); 112 bos.close(); 113 } 114 115 116 } 117 118 }