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


    首先不使用带缓冲的。

    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();
            }
        }
    }
  • 相关阅读:
    第四次
    jsp
    2021.3.4
    第八次作业
    第七次作业
    第六周作业
    第五周作业
    第四周
    第四次jsp作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/yunqing/p/7406752.html
Copyright © 2020-2023  润新知