使用帶緩沖的字符流讀取字符文件。


首先不使用帶緩沖的。

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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM