OutputStreamWriter(使用) 寫數據--(一次寫入一個字元) OutputStreamWriter(OutputStream out):根據預設編碼把位元組流的數據轉換為字元流 OutputStreamWriter(OutputStream out,String charsetName ...
OutputStreamWriter(使用)---寫數據--(一次寫入一個字元)
OutputStreamWriter(OutputStream out):根據預設編碼把位元組流的數據轉換為字元流
OutputStreamWriter(OutputStream out,String charsetName):根據指定編碼把位元組流數據轉換為字元流
* 把位元組流轉換為字元流。
* 字元流 = 位元組流 +編碼表。
package cn.itcast_02; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; /* * OutputStreamWriter(OutputStream out):根據預設編碼把位元組流的數據轉換為字元流 * OutputStreamWriter(OutputStream out,String charsetName):根據指定編碼把位元組流數據轉換為字元流 * 把位元組流轉換為字元流。 * 字元流 = 位元組流 +編碼表。 */ public class OutputStreamWriterDemo { public static void main(String[] args) throws IOException { // 創建對象 // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( // "osw.txt")); // 預設GBK // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( // "osw.txt"), "GBK"); // 指定GBK OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( "osw.txt"), "UTF-8"); // 指定UTF-8 // 寫數據 osw.write("中國"); // 釋放資源 osw.close(); } }
InputStreamReader---讀取數據--(一次讀取一個字元)
package cn.itcast_02; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /* * InputStreamReader(InputStream is):用預設的編碼讀取數據 * InputStreamReader(InputStream is,String charsetName):用指定的編碼讀取數據 */ public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { // 創建對象 // InputStreamReader isr = new InputStreamReader(new FileInputStream( // "osw.txt")); // InputStreamReader isr = new InputStreamReader(new FileInputStream( // "osw.txt"), "GBK"); InputStreamReader isr = new InputStreamReader(new FileInputStream( "osw.txt"), "UTF-8"); // 讀取數據 // 一次讀取一個字元 int ch = 0; while ((ch = isr.read()) != -1) { //此時的ch依然還是int類型--需要進行輸出類型的轉換 System.out.print((char) ch); } // 釋放資源 isr.close(); } }
* OutputStreamWriter的方法:
* public void write(int c):寫一個字元
* public void write(char[] cbuf):寫一個字元數組
* public void write(char[] cbuf,int off,int len):寫一個字元數組的一部分
* public void write(String str):寫一個字元串
* public void write(String str,int off,int len):寫一個字元串的一部分
*
* 面試題:close()和flush()的區別?
* A:close()關閉流對象,但是先刷新一次緩衝區。關閉之後,流對象不可以繼續再使用了。
* B:flush()僅僅刷新緩衝區,刷新之後,流對象還可以繼續使用。
*/
package cn.itcast_03; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; /* * OutputStreamWriter的方法: * public void write(int c):寫一個字元 * public void write(char[] cbuf):寫一個字元數組 * public void write(char[] cbuf,int off,int len):寫一個字元數組的一部分 * public void write(String str):寫一個字元串 * public void write(String str,int off,int len):寫一個字元串的一部分 * * 面試題:close()和flush()的區別? * A:close()關閉流對象,但是先刷新一次緩衝區。關閉之後,流對象不可以繼續再使用了。 * B:flush()僅僅刷新緩衝區,刷新之後,流對象還可以繼續使用。 */ public class OutputStreamWriterDemo { public static void main(String[] args) throws IOException { // 創建對象 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( "osw2.txt")); // 寫數據 // public void write(int c):寫一個字元 // osw.write('a'); // osw.write(97); // 為什麼數據沒有進去呢? // 原因是:字元 = 2位元組 // 文件中數據存儲的基本單位是位元組。 // void flush() // public void write(char[] cbuf):寫一個字元數組 // char[] chs = {'a','b','c','d','e'}; // osw.write(chs); // public void write(char[] cbuf,int off,int len):寫一個字元數組的一部分 // osw.write(chs,1,3); // public void write(String str):寫一個字元串 // osw.write("我愛林青霞"); // public void write(String str,int off,int len):寫一個字元串的一部分 osw.write("我愛林青霞", 2, 3); // 刷新緩衝區 osw.flush(); // osw.write("我愛林青霞", 2, 3); // 釋放資源 osw.close(); // java.io.IOException: Stream closed // osw.write("我愛林青霞", 2, 3); } }
InputStreamReader的方法:
* int read():一次讀取一個字元
* int read(char[] chs):一次讀取一個字元數組
package cn.itcast_03; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /* * InputStreamReader的方法: * int read():一次讀取一個字元 * int read(char[] chs):一次讀取一個字元數組 */ public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { // 創建對象 InputStreamReader isr = new InputStreamReader(new FileInputStream( "StringDemo.java")); // 一次讀取一個字元 // int ch = 0; // while ((ch = isr.read()) != -1) { // System.out.print((char) ch); // } // 一次讀取一個字元數組 char[] chs = new char[1024]; int len = 0; while ((len = isr.read(chs)) != -1) { System.out.print(new String(chs, 0, len)); } // 釋放資源 isr.close(); } }
字元流--- 需求:把當前項目目錄下的a.txt內容複製到當前項目目錄下的b.txt中
package cn.itcast_04; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; /* * 需求:把當前項目目錄下的a.txt內容複製到當前項目目錄下的b.txt中 * * 數據源: * a.txt -- 讀取數據 -- 字元轉換流 -- InputStreamReader * 目的地: * b.txt -- 寫出數據 -- 字元轉換流 -- OutputStreamWriter */ public class CopyFileDemo { public static void main(String[] args) throws IOException { // 封裝數據源 InputStreamReader isr = new InputStreamReader(new FileInputStream( "a.txt")); // 封裝目的地 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( "b.txt")); // 讀寫數據 // 方式1 // int ch = 0; // while ((ch = isr.read()) != -1) { // osw.write(ch); // } // 方式2 char[] chs = new char[1024]; int len = 0; while ((len = isr.read(chs)) != -1) { osw.write(chs, 0, len); // osw.flush(); } // 釋放資源 osw.close(); isr.close(); } }
字元流--- 需求:把當前項目目錄下的a.txt內容複製到當前項目目錄下的b.txt中----方式二
package cn.itcast_04; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 由於我們常見的操作都是使用本地預設編碼,所以,不用指定編碼。 * 而轉換流的名稱有點長,所以,Java就提供了其子類供我們使用。 * OutputStreamWriter = FileOutputStream + 編碼表(GBK) * FileWriter = FileOutputStream + 編碼表(GBK) * * InputStreamReader = FileInputStream + 編碼表(GBK) * FileReader = FileInputStream + 編碼表(GBK) * /* * 需求:把當前項目目錄下的a.txt內容複製到當前項目目錄下的b.txt中 * * 數據源: * a.txt -- 讀取數據 -- 字元轉換流 -- InputStreamReader -- FileReader * 目的地: * b.txt -- 寫出數據 -- 字元轉換流 -- OutputStreamWriter -- FileWriter */ public class CopyFileDemo2 { public static void main(String[] args) throws IOException { // 封裝數據源 FileReader fr = new FileReader("a.txt"); // 封裝目的地 FileWriter fw = new FileWriter("b.txt"); // 一次一個字元 // int ch = 0; // while ((ch = fr.read()) != -1) { // fw.write(ch); // } // 一次一個字元數組 char[] chs = new char[1024]; int len = 0; while ((len = fr.read(chs)) != -1) { fw.write(chs, 0, len); fw.flush(); } // 釋放資源 fw.close(); fr.close(); } }
BufferedWriter:字元緩衝輸出流
package cn.itcast_05; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; /* * 字元流為了高效讀寫,也提供了對應的字元緩衝流。 * BufferedWriter:字元緩衝輸出流 * BufferedReader:字元緩衝輸入流 * * BufferedWriter:字元緩衝輸出流 * 將文本寫入字元輸出流,緩衝各個字元,從而提供單個字元、數組和字元串的高效寫入。 * 可以指定緩衝區的大小,或者接受預設的大小。在大多數情況下,預設值就足夠大了。 */ public class BufferedWriterDemo { public static void main(String[] args) throws IOException { // BufferedWriter(Writer out) // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( // new FileOutputStream("bw.txt"))); BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); bw.write("hello"); bw.write("world"); bw.write("java"); bw.flush(); bw.close(); } }
* BufferedReader:字元緩衝輸入流
package cn.itcast_05; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /* * BufferedReader * 從字元輸入流中讀取文本,緩衝各個字元,從而實現字元、數組和行的高效讀取。 * 可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了。 * * BufferedReader(Reader in) */ public class BufferedReaderDemo { public static void main(String[] args) throws IOException { // 創建字元緩衝輸入流對象 BufferedReader br = new BufferedReader(new FileReader("bw.txt")); // 方式1 // int ch = 0; // while ((ch = br.read()) != -1) { // System.out.print((char) ch); // } // 方式2 char[] chs = new char[1024]; int len = 0; while ((len = br.read(chs)) != -1) { System.out.print(new String(chs, 0, len)); } // 釋放資源 br.close(); } }
利用BufferReader和BufferWriter----FileReader---FileWriter----進行文本的複製
package cn.itcast_06; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 需求:把當前項目目錄下的a.txt內容複製到當前項目目錄下的b.txt中 * * 數據源: * a.txt -- 讀取數據 -- 字元轉換流 -- InputStreamReader -- FileReader -- BufferedReader * 目的地: * b.txt -- 寫出數據 -- 字元轉換流 -- OutputStreamWriter -- FileWriter -- BufferedWriter */ public class CopyFileDemo { public static void main(String[] args) throws IOException { // 封裝數據源 BufferedReader br = new BufferedReader(new FileReader("a.txt")); // 封裝目的地 BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); // 兩種方式其中的一種一次讀寫一個字元數組 char[] chs = new char[1024]; int len = 0; while ((len = br.read(chs)) != -1) { bw.write(chs, 0, len); bw.flush(); } // 釋放資源 bw.close(); br.close(); } }
字元緩衝流的特殊用法
* 字元緩衝流的特殊方法:
* BufferedWriter:
* public void newLine():根據系統來決定換行符
* BufferedReader:
* public String readLine():一次讀取一行數據
* 包含該行內容的字元串,不包含任何行終止符,如果已到達流末尾,則返回 null
*/
package cn.itcast_05; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 字元緩衝流的特殊方法: * BufferedWriter: * public void newLine():根據系統來決定換行符 * BufferedReader: * public String readLine():一次讀取一行數據 * 包含該行內容的字元串,不包含任何行終止符,如果已到達流末尾,則返回 null */ public class BufferedDemo { public static void main(String[] args) throws IOException { // write(); read(); } private static void read() throws IOException { // 創建字元緩衝輸入流對象 BufferedReader br = new BufferedReader(new FileReader("bw2.txt")); // public String readLine():一次讀取一行數據 // String line = br.readLine(); // System.out.println(line); // line = br.readLine(); // System.out.println(line); // 最終版代碼 String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } //釋放資源 br.close(); } private static void write() throws IOException { // 創建字元緩衝輸出流對象 BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt")); for (int x = 0; x < 10; x++) { bw.write("hello" + x); // bw.write("\r\n"); bw.newLine(); bw.flush(); } bw.close(); } }
//利用字元緩衝流的特殊功能複製文本文件---一次複製一行
package cn.itcast_06; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 需求:把當前項目目錄下的a.txt內容複製到當前項目目錄下的b.txt中 * * 數據源: * a.txt -- 讀取數據 -- 字元轉換流 -- InputStreamReader -- FileReader -- BufferedReader * 目的地: * b.txt -- 寫出數據 -- 字元轉換流 -- OutputStreamWriter -- FileWriter -- BufferedWriter */ public class CopyFileDemo2 { public static void main(String[] args) throws IOException { // 封裝數據源 BufferedReader br = new BufferedReader(new FileReader("a.txt")); // 封裝目的地 BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); // 讀寫數據 String line = null; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } // 釋放資源 bw.close(); br.close(); } }
練習版
package Day21; import java.io.*; /* * 字元緩衝流的特殊方法: * BufferedWriter: * public void newLine():根據系統來決定換行符 * BufferedReader: * public String readLine():一次讀取一行數據 * 包含該行內容的字元串,不包含任何行終止符,如果已到達流末尾,則返回 null */ //利用字元緩衝流的特殊功能複製代碼---一次複製一行 public class Bufffered2 { public static void main(String[] args) throws IOException { //創建字元輸入緩衝流對象 BufferedReader file = new BufferedReader(new FileReader("zhao.txt")); //創建字元輸出緩衝流對象 BufferedWriter file1 = new BufferedWriter(new FileWriter("zhu.txt")); //複製文本文件 //一次複製一行 String tt = null; while((tt=file.readLine())!=null){ //複製一行數據 file1.write(tt); //進行換行--複製一行 file1.newLine(); //複製一行進行刷新 file1.flush(); } //釋放資源 file1.close(); file.close(); } }
小結
複製文本文件的5種方式---字元流
package cn.itcast_01; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 複製文本文件 * * 分析: * 複製數據,如果我們知道用記事本打開並能夠讀懂,就用字元流,否則用位元組流。 * 通過該原理,我們知道我們應該採用字元流更方便一些。 * 而字元流有5種方式,所以做這個題目我們有5種方式。推薦掌握第5種。 * 數據源: * c:\\a.txt -- FileReader -- BufferdReader * 目的地: * d:\\b.txt -- FileWriter -- BufferedWriter */ public class CopyFileDemo { public static void main(String[] args) throws IOException { String srcString = "c:\\a.txt"; String destString = "d:\\b.txt"; // method1(srcString, destString); // method2(srcString, destString); // method3(srcString, destString); // method4(srcString, destString); method5(srcString, destString); } // 字元緩衝流一次讀寫一個字元串 private static void method5(String srcString, String destString) throws IOException { BufferedReader br = new BufferedReader(new FileReader(srcString)); BufferedWriter bw = new BufferedWriter(new FileWriter(destString)); String line = null; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } bw.close(); br.close(); } // 字元緩衝流一次讀寫一個字元數組 private static void method4(String srcString, String destString) throws IOException { BufferedReader br = new BufferedReader(new FileReader(srcString)); BufferedWriter bw = new BufferedWriter(new FileWriter(destString)); char[] chs = new char[1024]; int len = 0; while ((len = br.read(chs)) != -1) { bw.write(chs, 0, len); } bw.close(); br.close(); } // 字元緩衝流一次讀寫一個字元 private static void method3(String srcString, String destString) throws IOException { BufferedReader br = new BufferedReader(new FileReader(srcString)); BufferedWriter bw = new BufferedWriter(new FileWriter(destString)); int ch = 0; while ((ch = br.read()) != -1) { bw.write(ch); } bw.close(); br.close(); } // 基本字元流一次讀寫一個字元數組 private static void method2(String srcString, String destString) throws IOException { FileReader fr = new FileReader(srcString); FileWriter fw = new FileWriter(destString); char[] chs = new char[1024]; int len = 0; while ((len = fr.read(chs)) != -1) { fw.write(chs, 0, len); } fw.close(); fr.close(); } // 基本字元流一次讀寫一個字元 private static void method1(String srcString, String destString) throws IOException { FileReader fr = new FileReader(srcString); FileWriter fw = new FileWriter(destString); int ch = 0; while ((ch = fr.read()) != -1) { fw.write(ch); } fw.close(); fr.close(); } }
複製圖片的4種方式---位元組流
package cn.itcast_01; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* * 複製圖片 * * 分析: * 複製數據,如果我們知道用記事本打開並能夠讀懂,就用字元流,否則用位元組流。 * 通過該原理,我們知道我們應該採用位元組流。 * 而位元組流有4種方式,所以做這個題目我們有4種方式。推薦掌握第4種。 * * 數據源: * c:\\a.jpg -- FileInputStream -- BufferedInputStream * 目的地: * d:\\b.jpg -- FileOutputStream -- BufferedOutputStream */ public class CopyImageDemo { public static void main(String[] args) throws IOException { // 使用字元串作為路徑 // String srcString = "c:\\a.jpg"; // String destString = "d:\\b.jpg"; // 使用File對象做為參數 File srcFile = new File("c:\\a.jpg"); File destFile = new File("d:\\b.jpg"); // method1(srcFile, destFile); // method2(srcFile, destFile); // method3(srcFile, destFile); method4(srcFile, destFile); } // 位元組緩衝流一次讀寫一個位元組數組 private static void method4(File srcFile, File destFile) throws IOException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream( srcFile)); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile)); byte[] bys = new byte[1024]; int len = 0; while ((len = bis.read(bys)) != -1) { bos.write(bys, 0, len); } bos.close(); bis.close(); } // 位元組緩衝流一次讀寫一個位元組 private static void method3(File srcFile, File destFile) throws IOException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream( srcFile)); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile)); int by = 0; while ((by = bis.read()) != -1) { bos.write(by); } bos.close(); bis.close(); } // 基本位元組流一次讀寫一個位元組數組 private static void method2(File srcFile, File destFile) throws IOException { FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); byte[] bys = new byte[1024]; int len = 0; while ((len = fis.read(bys)) != -1) { fos.write(bys, 0, len);