首先不使用帶緩沖的。
package com.yunqing; import java.io.*; public class readCharFile { public static void main(String[] args) { /* 一、流的概念和作用 學習Java IO流,我是真的有點無語啊。。。!相信很多學習Java的朋友在起初學習Java IO的時候都會覺得很簡單,可是真正用的使用的時候又措手不及,這是一個比較正常的現象,這不能怪你,因為Java設計者在設計Java IO這個類庫時,就已然注定了這樣蛋疼的一個局面。Java IO的學習之難,主要有兩點:其一是構建一個實例需要借助其他的一個或多個實例,其次是類多而雜。你需要以一種俯瞰的視角來對待Java IO,只要你了解了Java IO類庫的層次關系,你就可以很好的使用它了,是不是很激動...^_^,下面讓我們來看看流的概念: 流:是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱和抽象。即數據在兩設備間的傳輸成為流,流的本質是數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀的進行數據操作。 二、流的分類 根據處理數據類型的不同分:字符流和字節流 根據數據流向不同分為:輸入流和輸出流 三、字符流和字節流 字符流的由來:因為數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼表。 字節流和字符流的區別: (1)讀寫單位不同:字節流以字節(8bit)為單位,字符流以字符(16bit)為單位,根據碼表映射字符。 (2)處理對象不同:字節流能處理所有類型的數據(如:圖片、音樂、視頻等媒體介質),而字符流只能處理字符類型的數據。 (3)字節流在操作的時候本身是不會用到緩沖區的,是文件本身的直接操作的;而字符流在操作的時候是會用到緩沖區的,是通過緩沖區來操作文件。 建議:當我們在處理媒體介質時,請選擇字節流;當我們在處理字符介質時,請選擇字符流;當我們不明確操作的介質的類型時,請選擇字節流。 一般來說音樂、圖像、流媒體文件都用字節流來讀,文本文件用字符流來讀。IO操作的本質都是字節流,所以當你用字符流從io設備讀寫東西的時候就需要涉及 到字符集編碼,即你想用什么編碼來解釋那些讀到的或者即將寫出的字節。所以java中的字符流對象都會有Charset參數。 */ //注意******本例子使用的IDE是idea //idea的讀取根目錄文件 File file =new File("java.txt"); try { //輸入流 FileInputStream fis=new FileInputStream(file); //InputStreamReader : 是字節流與字符流之間的橋梁,能將字節流輸出為字符流,並且能為字節流指定字符集,可輸出一個個的字符; InputStreamReader isr=new InputStreamReader(fis,"GBK"); //輸出流 FileOutputStream fos=new FileOutputStream("new_java.txt"); //OutputStreamWriter 將字節流轉換為字符流。是字節流通向字符流的橋梁。如果不指定字符集編碼,該解碼過程將使用平台默認的字符編碼,如:GBK。 //主要方法:void write(int c);//將單個字符寫入。 //viod write(String str,int off,int len);//將字符串某部分寫入。 //void flush();//將該流中的緩沖數據刷到目的地中去 OutputStreamWriter osw=new OutputStreamWriter(fos); int len; char char_[]=new char[100]; while((len=isr.read(char_))!=-1){ //System.out.println(char_);//這種寫法讀取的數據會與之前的有一些差別,會多出一些字符串在結尾 //讀取char_,從第0個字符開始讀取,讀取len中的數據 osw.write(char_,0,len); } //后打開的先關閉 osw.close(); fos.close(); isr.close(); fis.close(); System.out.println("done"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
使用帶緩沖的
package com.yunqing; import java.io.*; public class readCharBuffer { public static void main(String[] args) { try { FileInputStream fis=new FileInputStream("java.txt"); FileOutputStream fos=new FileOutputStream("java_buffer.txt"); InputStreamReader isr=new InputStreamReader(fis,"GBK"); OutputStreamWriter osw=new OutputStreamWriter(fos); //BufferedReader : 提供通用的緩沖方式文本讀取,readLine讀取一個文本行, 從字符輸入流中讀取文本,緩沖各個字符,從而提供字符、數組和行的高效讀取。 BufferedReader br=new BufferedReader(isr); //這種方法讀取的數據會根據換行來返回,最后得到的數據沒有換行,都在一行。 //BufferedWriter bw=new BufferedWriter(osw); // //使用這種方法來讀取一行並在末尾加上換行符 //true:autoFlush強制輸出緩沖里的所有數據保證數據的完整性。這里不寫true下面就要寫//pw.flush(); PrintWriter pw=new PrintWriter(osw,true); String str; while ((str=br.readLine())!=null){ //bw.write(str); pw.println(str);//輸出緩沖區里的字符 } //pw.flush();//把緩沖區的數據全部讀取出來,保證數據的完整性 pw.close(); //bw.flush();//把緩沖區的數據全部讀取出來,保證數據的完整性 //bw.close(); br.close(); osw.close(); isr.close(); fos.close(); fis.close(); System.out.println("done"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }