IO流之三

 

   IO流之三——字符流

Reader

       |--InputStreamReader

              |--FileReader:专门用于处理文件的字符读取流对象。

Writer

       |--OutputStreamWriter

                   |--FileWriter:专门用于处理文件的字符写入流对象。

 

      

       Reader中的常见的方法:

                   1,int read():读取一个字符。返回的是读到的那个字符。如果读到流的末尾,返回-1.

                   2,int read(char[]):将读到的字符存入指定的数组中,返回的是读到的字符个数,

                                     也就是往数组里装的元素的个数。如果读到流的末尾,返回-1.

                   3,close():读取字符其实用的是window系统的功能,就希望使用完毕后,进行资源的释放。

        

      Writer中的常见的方法:

                   1,write(ch): 将一个字符写入到流中。

                   2,write(char[]): 将一个字符数组写入到流中。

                   3,write(String): 将一个字符串写入到流中。

                   4,flush():刷新流,将流中的数据刷新到目的地中,流还存在。

                   5,close():关闭资源:先关闭前会先调用flush,刷新流中的数据去目的地。然流关闭。

 

        

      FileWriter:

                   该类没有特有的方法。只有自己的构造函数。

                   该类特点在于,

                   1,用于处理文本文件。

                   2,该类中有默认的编码表,

                   3,该类中有临时缓冲。

                  

                   构造函数:在写入流对象初始化时,必须要有一个存储数据的目的地。

                   FileWriter(String filename):

                   该构造函数做了什么事情呢?

                   1,调用系统资源。

                   2,在指定位置,创建一个文件。

                            注意:如果该文件已存在,将会被覆盖。

                   FileWriter(String filename,boolean append):

                            该构造函数:当传入的boolean类型值为true时,会在指定文件末尾处进行数据的续写。

 

      FileReader:

                   1,用于读取文本文件的流对象。

                   2,用于关联文件文件。

 

                   构造函数:在读取流对象初始化的时候,必须要指定一个被读取的文件。

                                     如果该文件不存在会发生FileNotFoundException.

                   FileReader(String filename);

1、将文本数据存储到一个文件中。         

         class Demo      {

                   public static void main(String[] args)throws IOException{

                            FileWriter fw = new FileWrier("demo.txt");

                            fw.write("abcdec");

                            fw.flush();

                            fw.write("kkkk");

                            fw.close();

                   }

         }

 

         对于读取或者写入流对象的构造函数,以及读写方法,还有刷新关闭功能都会抛出IOException或其子类。

 

         所以都要进行处理。或者throws抛出,或者try catch处理。

        

         完整的异常处理方式。

         class Demo{

                   public static void main(String[] args)throws IOException{

                            FileWriter fw = null;

                            try{

                                     fw = new FileWrier("z:\\demo.txt");

                                     fw.write("abcdec");

 

                                     fw.flush();

                                     fw.write("kkkk");

 

                            }catch(IOException e){

                                     System.out.println(e.toString());

                            }finally{

                                     if(fw!=null){

                                               try {

                                                        fw.close();        

                                               }catch(IOException e){

                                                        System.out.println("close:"+e.toString());

                                               }

}

                            }

                   }

         }

                  

         另一个小细节:

                   当指定绝对路径时,定义目录分隔符有两种方式:

                   1,反斜线 但是一定要写两个。\\  new FileWriter("c:\\demo.txt");

                   2,斜线  /  写一个即可。 new FileWriter("c:/demo.txt");

2、读取一个已有的文本文件将文本数据打印出来。

class Demo {

    public static void main(String[] args) throws IOException {

       FileReader fr = new FileReader("demo.txt");

       int ch = 0;

       // 一次读一个字符。

       while ((ch = fr.read()) != -1) {

           System.out.print((char) ch);

       }

       fr.close();

    }

}

 

class Demo {

    public static void main(String[] args) {

       FileReader fr = null;

       try {

           new FileReader("demo.txt");

           char[] buf = new char[1024];// 该长度通常都是1024的整数倍。

 

           int len = 0;

           while ((len = fr.read(buf)) != -1) {

              System.out.println(new String(buf, 0, len));

           }

       } catch (IOException e) {

           System.out.println(e.toString());

       } finally {

           if (fr != null){

              try {

                  fr.close();

              } catch (IOException e) {

                  System.out.println("close:" + e.toString());

              }

           }

       }

    }

}

字符流的缓冲区:

缓冲区的出现提高了对流的操作效率。

原理:其实就是将数组进行封装。

BufferedWriter、 BufferedReader

对应的类:

l         BufferedWriter:

         特有方法:

                   newLine():跨平台的换行符。

l         BufferedReader:

         特有方法:

                   readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。            当读到末尾时,返回null。

 

         在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的功能而存在,所以在建立缓冲区对象时,要先有流对象存在。

         其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时存储。为了提高操作数据的效率。

 

代码上的体现:

 

写入缓冲区对象。

 

//建立缓冲区对象必须把流对象作为参数传递给缓冲区的构造函数。

BufferedWriter bufw = new BufferedWriter(new FileWriter("buf.txt"));

bufw.write("abce");//将数据写入到了缓冲区。

bufw.flush();//对缓冲区的数据进行刷新。将数据刷到目的地中。

bufw.close();//关闭缓冲区,其实关闭的是被包装在内部的流对象。

 

读取缓冲区对象。

 

BufferedReader bufr = new BufferedReader(new FileReader("buf.txt"));     

String line = null;

//按照行的形式取出数据。取出的每一个行数据不包含回车符。

while((line=bufr.readLine())!=null) {

         System.out.println(line);

}

bufr.close();

 

练习:通过缓冲区的形式,对文本文件进行拷贝。

 

public static void main(String[] args) {

    BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));

    BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));

 

    String line = null;

 

    while ((line = bufr.readLine()) != null) {

       bufw.write(line);

       bufw.newLine();

       bufw.flush();

    }

 

    bufw.close();

    bufr.close();

}

 

 

readLine():方法的原理:

其实缓冲区中的该方法,用的还是与缓冲区关联的流对象的read方法。只不过,每一次读到一个字符,先不进行具体操作,先进行临时存储。当读取到回车标记时,将临时容器中存储的数据一次性返回。既然明确了原理,我们也可以实现一个类似功能的方法。

 

class MyBufferedReader {

    private Reader r;

 

    MyBufferedReader(Reader r) {

       this.r = r;

    }

 

    public String myReadLine() throws IOException {

       // 1,创建临时容器。

       StringBuilder sb = new StringBuilder();

 

       // 2,循环的使用read方法不断读取字符。

       int ch = 0;

       while ((ch = r.read()) != -1) {

           if (ch == '\r')

              continue;

           if (ch == '\n')

              return sb.toString();

           else

              sb.append((char) ch);

       }

 

       if (sb.length() != 0)

           return sb.toString();

       return null;

    }

 

    public void myClose() throws IOException {

       r.close();

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值