使用带缓冲的字符流读取字符文件。

时间:2021-12-19 21:01:20

首先不使用带缓冲的。

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