總結IO流結構
功能流:1.轉換流 2.緩沖流
InputStreamReader : 讀 in 輸入節--符 看不懂轉看的懂
OutputStreamWriter :寫 out 輸出 符--節 看的懂轉看不懂
轉換流就是字符流
轉換流只有writer和reader 轉換流沒有字節流
功能:緩沖流 Buffered(加速緩沖的速度)
字節和字符流都可以加速
緩沖流分 字符和字節
字節:分字節輸出流和字節輸入流
字符:字符輸出流和字符輸入流
總結 :流的規律 4個明確
1:是數據源還是數據目的
源:就是輸入 InputStream 讀取數據 Reader
目的 :輸出 OutputStream 寫入數據 Writer 根據需要明確要讀還是要寫
2:操作字節還是文本
源:字節 InputStream 文本 Reader
目的 :字節 OutputStream 文本 Writer
3.數據所在具體設備
源設備:
硬盤:文件 File開頭。
內存:數組,字符串。
鍵盤:System.in;
網絡:Socket
目的設備:
硬盤:文件 File開頭
內存:數組,字符串。
屏幕:System.out;
網絡:Socket
4.是否需要功能
轉換:轉換流 InputStreamReader 和OutputStreamWriter
高效:緩沖區 Bufferedxxx
字節輸入 InputStream 字節輸出OutputStream 字符輸出流 Writer 字符輸入流 Reader
類讀取數據FileInputStream 文件輸出流 FileOutputStream 字符轉字節 OutputStreamWriter 字節轉字符InputStreamReader
字節緩沖輸入流 BufferedInputStream 字節緩沖輸出流 BufferedOutputStream 寫入文件 FileWriter 字符緩沖輸出 BufferedWriter 文件讀取 FileReader 字符緩沖輸入 BufferedReader
轉換輸出流:字符流通向字節流的橋梁:可使用指定的字符編碼表,將要寫入流中的字符編碼成字節 作用:將字符串按照指定的編碼表轉成字節,在使用字節流將這些字節寫出去
package com.oracle.demo01; \\轉換輸出流 import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; public class Demo01 { public static void main(String[] args) throws IOException { // 明確目的地 FileOutputStream fos=new FileOutputStream("F:\\java\\a.txt"); // 創建轉換流對象 默認GBK OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8"); // 寫入字符 osw.write("你好"); // 字符流都要刷新一下 osw.flush(); // 釋放資源 osw.close();//這里需要關閉功能流,fos被osw調用,osw負責關閉,誰調用的,誰關閉 } }
轉換輸入流:字節流通向字符流的橋梁:它使用指定的字符編碼表讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平台默認的字符集
package com.oracle.demo01; //轉換輸入流 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; public class Demo02 { public static void main(String[] args) throws IOException { // 明確數據源 FileInputStream fis=new FileInputStream("F:\\java\\a.txt"); // 創建轉換流對象 InputStreamReader isr=new InputStreamReader(fis,"UTF-8"); // 一次讀一個char數組 int len=0; char[] ch=new char[1024]; // 開始讀 while((len=isr.read(ch))!=-1){ //!=-1 是結束標記,一次讀個字符數組,當讀完后得返回 System.out.println(new String(ch,0,len));//用String轉,如果不寫 0,len 1024長度全部空格都寫出來 // 釋放資源 isr.close(); } } }
轉換流和子類區別:
OutputStreamWriter和InputStreamReader是字符和字節的橋梁:也可以稱為字符轉換流。字符轉換流原理:字節流+編碼表。
FileWriter和FileReader:作為子類,僅作為字符文件便捷類存在。當操作的字符文件,使用的是默認編碼表時可以不用父類,而直接用子類就完成操作了,簡化了代碼。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默認字符集。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。
FileReader fr = new FileReader("a.txt");
這三句代碼的功能是一樣的,其中第三句最為便捷。
注意:一旦要指定其他編碼時,絕對不能用子類,必須使用字符轉換流
用子類條件:
1、操作的是文件。2、使用默認編碼。
總結:
字節--->字符 : 看不懂的--->看的懂的。 要讀。輸入流。 InputStreamReader
字符--->字節 : 看的懂的--->看不懂的。 需要寫。輸出流。 OutputStreamWriter
轉換流復制
package com.oracle.demo01; //轉換流復制 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; public class copy { public static void main(String[] args) throws IOException { // 1.先明確數據源 FileInputStream fis=new FileInputStream("F:\\java\\a.txt"); // 2.創建字符輸入轉換流 InputStreamReader isr=new InputStreamReader(fis,"UTF-8"); // 3.明確目的地 FileOutputStream fos=new FileOutputStream("F:\\java\\aa.txt"); // 4.創建字符輸出轉換流 OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8"); // 5.開始復制 char[] ch=new char[1024]; int len=0; while((len=isr.read(ch))!=-1){// 當它讀不到數組的時候,返回-1 osw.write(ch,0,len); osw.flush();//刷一次更新一次 } // 釋放資源 isr.close(); osw.close(); } }
pm
字節緩沖輸出流
package com.oracle.demo02; import java.io.BufferedOutputStream; //字節緩沖輸出流 import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException { // 明確目的地 FileOutputStream fos=new FileOutputStream("f:\\java\\hello.txt"); // 創建緩沖區對象(給字節輸出流添加緩沖區) BufferedOutputStream bos= new BufferedOutputStream(fos);//()里寫誰 誰就是進緩沖區 // 寫入 bos.write("abc213".getBytes()); // 釋放資源 bos.close(); } }
字節緩沖輸入流
package com.oracle.demo02; //字節緩沖輸入流 import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; //字節輸入流 public class Demo02 { public static void main(String[] args) throws IOException { // 明確數據源 FileInputStream fis=new FileInputStream("F:\\java\\hello.txt"); // 創建緩沖流 BufferedInputStream bis=new BufferedInputStream(fis); int len=0; while((len=bis.read())!=-1){ System.out.print((char)len); } // 釋放資源 bis.close(); } }
字符緩沖輸出流
package com.oracle.demo02; //字符緩沖輸出流 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class Demo03 { public static void main(String[] args) throws IOException { // 明確目的地 FileWriter fw=new FileWriter("F:\\java\\hello.txt"); // 創建字符輸出緩沖流 BufferedWriter bw=new BufferedWriter(fw); bw.write("你好啊胸大"); bw.flush(); bw.newLine(); bw.write("我很好光頭強"); // 釋放資源 bw.close(); } }
字符緩沖輸入流
package com.oracle.demo02; //字符緩沖輸入流 import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class readline { public static void main(String[] args) throws IOException { // 明確數據源 FileReader fr=new FileReader("f:\\java\\hello.txt"); // 創建字符輸入緩沖流 BufferedReader br=new BufferedReader(fr); /*String line=br.readLine();//讀一行 System.out.println(line); line=br.readLine(); System.out.println(line); line=br.readLine(); System.out.println(line);*/ byte[] bytes=new byte[1024]; String line=null; while((line=br.readLine())!=null){ System.out.println(line); } // 釋放資源 br.close(); } }
復制字節緩沖流
package com.oracle.demo02; //復制字節緩沖流 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Copy { public static void main(String[] args) throws IOException { Long start= System.currentTimeMillis(); // 明確數據源 FileInputStream fis=new FileInputStream("f:\\java\\hello.txt"); // 創建字節輸入緩沖流 BufferedInputStream bis=new BufferedInputStream(fis); // 明確目的地 FileOutputStream fos=new FileOutputStream("f:\\java\nihao.txt"); // 創建字節輸出緩沖流 BufferedOutputStream bos=new BufferedOutputStream(fos); byte[] bytes=new byte[1024]; int len=0; while((len=bis.read(bytes))!=-1){ bos.write(bytes,0,len); } Long end=System.currentTimeMillis(); // 釋放資源 bis.close(); bos.close(); System.out.println("輸出時間為:"+(end-start)+"毫秒值"); } }
復制行字節緩沖流
package com.oracle.demo02; //復制行緩沖輸出流 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyLine { public static void main(String[] args) throws IOException { // 明確數據源 FileReader fr=new FileReader("f:\\java\\hello.txt"); // 創建字符輸入緩沖流 BufferedReader br=new BufferedReader(fr); // 明確目的地 FileWriter fw=new FileWriter("F:\\java\\nihao.txt"); BufferedWriter bw=new BufferedWriter(fw); String line=null; // 開始復制 // 讀一行寫一個字符串 while((line=br.readLine())!=null){ bw.write(line); // 換行 bw.newLine(); bw.flush(); } // 釋放資源 bw.close(); br.close(); } }
流的操作規則:
把IO流進行了規律的總結(四個明確):
1、 明確一:要操作的數據是數據源還是數據目的。
源:InputStream Reader
目的:OutputStream Writer
先根據需求明確要讀,還是要寫。
2、明確二:要操作的數據是字節還是文本呢?
源:
字節:InputStream
文本:Reader
目的:
字節:OutputStream
文本:Writer
已經明確到了具體的體系上。
3、明確三:明確數據所在的具體設備。
源設備:
硬盤:文件 File開頭。
內存:數組,字符串。
鍵盤:System.in;
網絡:Socket
目的設備:
硬盤:文件 File開頭。
內存:數組,字符串。
屏幕:System.out
網絡:Socket
完全可以明確具體要使用哪個流對象。
4、明確四:是否需要額外功能呢?
額外功能:
轉換嗎?轉換流。InputStreamReader OutputStreamWriter
高效嗎?緩沖區對象。BufferedXXX