今日內容介紹
一、轉換流
二、緩衝流java
* A: 轉換流概述 * a: 轉換流概述 * OutputStreamWriter 是字符流通向字節流的橋樑:可以使用指定的字符編碼表,將要寫入流中的字符編碼成字節 * 將字符串按照指定的編碼表轉成字節,在使用字節流將這些字節寫出去
* A: OutputStreamWriter寫文本文件 * a: OutputStreamWriter * java.io.OutputStreamWriter 繼承Writer類 * 就是一個字符輸出流,寫文本文件 * write()字符,字符數組,字符串 * 字符通向字節的橋樑,將字符流轉字節流 * OutputStreamWriter 使用方式 * 構造方法: * OutputStreamWriter(OuputStream out)接收全部的字節輸出流 * 字節輸出流: FileOutputStream * OutputStreamWriter(OutputStream out, String charsetName) * String charsetName 傳遞編碼表名字 GBK UTF-8 * OutputStreamWriter 有個子類, FileWriter * b: 案例代碼 public class OutputStreamWriterDemo { public static void main(String[] args)throws IOException { // writeGBK(); writeUTF(); } /* * 轉換流對象OutputStreamWriter寫文本 * 採用UTF-8編碼表寫入 */ public static void writeUTF()throws IOException{ //建立字節輸出流,綁定文件 FileOutputStream fos = new FileOutputStream("c:\\utf.txt"); //建立轉換流對象,構造方法保證字節輸出流,並指定編碼表是UTF-8 OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); osw.write("你好"); osw.close(); } /* * 轉換流對象 OutputStreamWriter寫文本 * 文本採用GBK的形式寫入 */ public static void writeGBK()throws IOException{ //建立字節輸出流,綁定數據文件 FileOutputStream fos = new FileOutputStream("c:\\gbk.txt"); //建立轉換流對象,構造方法,綁定字節輸出流,使用GBK編碼表 OutputStreamWriter osw = new OutputStreamWriter(fos); //轉換流寫數據 osw.write("你好"); osw.close(); } }
* A: 轉換流_字節轉字符流過程 * a: InputStreamReader * java.io.InputStreamReader 繼承 Reader * 字符輸入流,讀取文本文件 * 字節流向字符的敲了,將字節流轉字符流 * 讀取的方法: * read() 讀取1個字符,讀取字符數組 * 技巧 * OuputStreamWriter寫了文件 * InputStreamReader讀取文件 * OutputStreamWriter(OutputStream out)全部字節輸出流 * InputStreamReader(InputStream in) 接收全部的字節輸入流 * 能夠傳遞的字節輸入流: FileInputStream * InputStreamReader(InputStream in,String charsetName) 傳遞編碼表的名字 * b: 圖解 * 詳見day24_source/轉換流.JPG圖片
* A: InputSteamReader讀取文本文件 * a: 案例代碼 public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { // readGBK(); readUTF(); } /* * 轉換流,InputSteamReader讀取文本 * 採用UTF-8編碼表,讀取文件utf */ public static void readUTF()throws IOException{ //建立本身輸入流,傳遞文本文件 FileInputStream fis = new FileInputStream("c:\\utf.txt"); //建立轉換流對象,構造方法中,包裝字節輸入流,同時寫編碼表名 InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); char[] ch = new char[1024]; int len = isr.read(ch); System.out.println(new String(ch,0,len)); isr.close(); } /* * 轉換流,InputSteamReader讀取文本 * 採用系統默認編碼表,讀取GBK文件 */ public static void readGBK()throws IOException{ //建立本身輸入流,傳遞文本文件 FileInputStream fis = new FileInputStream("c:\\gbk.txt"); //建立轉換流對象,構造方法,包裝字節輸入流 InputStreamReader isr = new InputStreamReader(fis); char[] ch = new char[1024]; int len = isr.read(ch); System.out.println(new String(ch,0,len)); isr.close(); } }
* A: 轉換流子類父類的區別 * a: 繼承關係 OutputStreamWriter: |--FileWriter: InputStreamReader: |--FileReader; * b: 區別 * 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");
* A: 緩衝流概述 * a: 概述 * 可提升IO流的讀寫速度 * 分爲字節緩衝流與字符緩衝流
* A: 字節輸出流緩衝流BufferedOutputStream * a: BufferedOutputStream * 字節輸出流的緩衝流 * java.io.BufferedOuputStream 做用: 提升原有輸出流的寫入效率 * BufferedOuputStream 繼承 OutputStream * 方法,寫入 write 字節,字節數組 * 構造方法: * BufferedOuputStream(OuputStream out) * 能夠傳遞任意的字節輸出流, 傳遞的是哪一個字節流,就對哪一個字節流提升效率 * b: 案例代碼 public class BufferedOutputStreamDemo { public static void main(String[] args)throws IOException { //建立字節輸出流,綁定文件 //FileOutputStream fos = new FileOutputStream("c:\\buffer.txt"); //建立字節輸出流緩衝流的對象,構造方法中,傳遞字節輸出流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("c:\\buffer.txt")); bos.write(55); byte[] bytes = "HelloWorld".getBytes(); bos.write(bytes); bos.write(bytes, 3, 2); bos.close(); } }
* A: 字節輸入流緩衝流BufferedInputStream * a: BufferedInputStream * 字節輸入流的緩衝流 * 繼承InputStream,標準的字節輸入流 * 讀取方法 read() 單個字節,字節數組 * 構造方法: * BufferedInputStream(InputStream in) * 能夠傳遞任意的字節輸入流,傳遞是誰,就提升誰的效率 * 能夠傳遞的字節輸入流 FileInputStream * b: 案例代碼 public class BufferedInputStreamDemo { public static void main(String[] args) throws IOException{ //建立字節輸入流的緩衝流對象,構造方法中包裝字節輸入流,包裝文件 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("c:\\buffer.txt")); byte[] bytes = new byte[10]; int len = 0 ; while((len = bis.read(bytes))!=-1){ System.out.print(new String(bytes,0,len)); } bis.close(); } }
* A:四種文件複製方式的效率比較 * a: 四中複製方式 * 字節流讀寫單個字節 125250 毫秒 * 字節流讀寫字節數組 193 毫秒 OK * 字節流緩衝區流讀寫單個字節 1210 毫秒 * 字節流緩衝區流讀寫字節數組 73 毫秒 OK * b: 案例代碼 public class Copy { public static void main(String[] args)throws IOException { long s = System.currentTimeMillis(); copy_4(new File("c:\\q.exe"), new File("d:\\q.exe")); long e = System.currentTimeMillis(); System.out.println(e-s); } /* * 方法,實現文件複製 * 4. 字節流緩衝區流讀寫字節數組 */ public static void copy_4(File src,File desc)throws IOException{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc)); int len = 0 ; byte[] bytes = new byte[1024]; while((len = bis.read(bytes))!=-1){ bos.write(bytes,0,len); } bos.close(); bis.close(); } /* * 方法,實現文件複製 * 3. 字節流緩衝區流讀寫單個字節 */ public static void copy_3(File src,File desc)throws IOException{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc)); int len = 0 ; while((len = bis.read())!=-1){ bos.write(len); } bos.close(); bis.close(); } /* * 方法,實現文件複製 * 2. 字節流讀寫字節數組 */ public static void copy_2(File src,File desc)throws IOException{ FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream(desc); int len = 0 ; byte[] bytes = new byte[1024]; while((len = fis.read(bytes))!=-1){ fos.write(bytes,0,len); } fos.close(); fis.close(); } /* * 方法,實現文件複製 * 1. 字節流讀寫單個字節 */ public static void copy_1(File src,File desc)throws IOException{ FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream(desc); int len = 0 ; while((len = fis.read())!=-1){ fos.write(len); } fos.close(); fis.close(); } }
* A: 字符輸出流緩衝流BufferedWriter * a: BufferedWriter * 字符輸出流緩衝區流 * java.io.BufferedWriter 繼承 Writer * 寫入方法 write () 單個字符,字符數組,字符串 * 構造方法: * BufferedWriter(Writer w)傳遞任意字符輸出流 * 傳遞誰,就高效誰 * 能傳遞的字符輸出流 FileWriter, OutputStreamWriter * b: 案例代碼 public class BufferedWrierDemo { public static void main(String[] args) throws IOException{ //建立字符輸出流,封裝文件 FileWriter fw = new FileWriter("c:\\buffer.txt"); BufferedWriter bfw = new BufferedWriter(fw); bfw.write(100); bfw.flush(); bfw.write("你好".toCharArray()); bfw.flush(); bfw.write("你好"); bfw.flush(); bfw.write("我好好"); bfw.flush(); bfw.write("你們都好"); bfw.flush(); bfw.close(); } }
* A: 字符輸出流緩衝流BufferedWriter特有方法newLine * a: 方法介紹 * void newLine() 寫換行 * newLine()文本中換行, \r\n也是文本換行 * 方法具備平臺無關性 * Windows \r\n * Linux \n * newLine()運行結果,和操做系統是相互關係 * JVM: 安裝的是Windows版本,newLine()寫的就是\r\n * 安裝的是Linux版本,newLine()寫的就是\n /* * 將數據源 c:\\a.txt * 複製到 d:\\a.txt 數據目的 * 字節輸入流,綁定數據源 * 字節輸出流,綁定數據目的 * * 輸入,讀取1個字節 * 輸出,寫1個字節 */ * b: 案例代碼 public class BufferedWrierDemo { public static void main(String[] args) throws IOException{ //建立字符輸出流,封裝文件 FileWriter fw = new FileWriter("c:\\buffer.txt"); BufferedWriter bfw = new BufferedWriter(fw); bfw.write(100); bfw.flush(); bfw.write("你好".toCharArray()); bfw.flush(); bfw.write("你好"); bfw.newLine(); bfw.flush(); bfw.write("我好好"); bfw.newLine(); bfw.flush(); bfw.write("你們都好"); bfw.flush(); bfw.close(); } }
* A: 字符輸入流緩衝流BufferedReader * a: 概述 * 從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取 * public String readLine() 讀取一個文本行,包含該行內容的字符串, * 不包含任何行終止符,若是已到達流末尾,則返回 null
* A: 字符輸入流緩衝流BufferedReader讀取文本行 * a: BufferedReader * 字符輸入流緩衝流 * java.io.BufferedReader 繼承 Reader * 讀取功能 read() 單個字符,字符數組 * 構造方法: * BufferedReader(Reader r) * 能夠任意的字符輸入流 FileReader InputStreamReader * BufferedReader本身的功能 * String readLine() 讀取文本行 \r\n * 方法讀取到流末尾,返回null * b: 小特色 * 獲取內容的方法通常都有返回值 * int 沒有返回的都是負數 * 引用類型 找不到返回null * boolean 找不到返回false * c: 案例代碼 public class BufferedReaderDemo { public static void main(String[] args) throws IOException { int lineNumber = 0; //建立字符輸入流緩衝流對象,構造方法傳遞字符輸入流,包裝數據源文件 BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt")); //調用緩衝流的方法 readLine()讀取文本行 //循環讀取文本行, 結束條件 readLine()返回null String line = null; while((line = bfr.readLine())!=null){ lineNumber++; System.out.println(lineNumber+" "+line); } bfr.close(); } } /* * String line = bfr.readLine(); System.out.println(line); line = bfr.readLine(); System.out.println(line); line = bfr.readLine(); System.out.println(line); line = bfr.readLine(); System.out.println(line); line = bfr.readLine(); System.out.println(line); */
* A: 字符流緩衝區流複製文本文件 * a: 案例代碼 /* * 使用緩衝區流對象,複製文本文件 * 數據源 BufferedReader+FileReader 讀取 * 數據目的 BufferedWriter+FileWriter 寫入 * 讀取文本行, 讀一行,寫一行,寫換行 */ public class Copy_1 { public static void main(String[] args) throws IOException{ BufferedReader bfr = new BufferedReader(new FileReader("c:\\w.log")); BufferedWriter bfw = new BufferedWriter(new FileWriter("d:\\w.log")); //讀取文本行, 讀一行,寫一行,寫換行 String line = null; while((line = bfr.readLine())!=null){ bfw.write(line); bfw.newLine(); bfw.flush(); } bfw.close(); bfr.close(); } }
* A: IO流對象的操做規律 * a: 明確一:要操做的數據是數據源仍是數據目的。 * 源:InputStream Reader * 目的:OutputStream Writer * 先根據需求明確要讀,仍是要寫。 * b: 明確二:要操做的數據是字節仍是文本呢? * 源: * 字節:InputStream * 文本:Reader * 目的: * 字節:OutputStream * 文本:Writer * c: 明確三:明確數據所在的具體設備。 * 源設備: * 硬盤:文件 File開頭。 * 內存:數組,字符串。 * 鍵盤:System.in; * 網絡:Socket * 目的設備: * 硬盤:文件 File開頭。 * 內存:數組,字符串。 * 屏幕:System.out * 網絡:Socket * 徹底能夠明確具體要使用哪一個流對象。 * d: 明確四:是否須要額外功能呢? * 額外功能: * 轉換嗎?轉換流。InputStreamReader OutputStreamWriter * 高效嗎?緩衝區對象。BufferedXXX * 已經明確到了具體的體系上。 *
1.將前面做業中關於文件拷貝的操做,替換爲高效流數組
- 用代碼實現如下需求
(1)有以下字符串"If you want to change your fate I think you must come to the dark horse to learn java"(用空格間隔) (2)打印格式: to=3 think=1 you=2 //........ (3)按照上面的打印格式將內容寫入到D:\\count.txt文件中(要求用高效流)
3.利用轉換流將GBK格式文件以UTF-8輸出網絡
4.java寫一個程序,實現從文件中讀出文件內容,並將其打印在屏幕當中,並標註上行號學習
若是想進一步的交流,能夠加入咱們的QQ羣,裏面有最新的學習資料,能夠學習。測試