黑马程序员-字符流

一、IO流概述

IO流的作用和分类:

1)   IO流用来处理设备之间的数据传输

2)   Java对数据的操作时通过流的方式

3)   Java用于操作流的对象都在IO包中

4)  流按操作数据分为两种:字节流与字符流

字符流的抽象基类:Reader/Writer

字节流的抽象基类:InputStream/OutputStream

5)     流按流向分为:输入流与输出

Writer与Reader:是字符输入输出的抽象类

InputStream与OutputStream:是字节输入输出的抽象类

FileWriter与FileReader:是可以读写文件的类,用于操作文本

FileInputStream与FileOutputStream:是可以读写文件中字节数据的类,用于操作二进制数据

InputStreamReader与OutputStreamWriter:是字节通向字符的桥梁

BufferedWriter与BufferedReader:字符流的缓冲区,用于为了提高流的效率

BufferedInputStream与BufferedOutputStream:是字节流的缓冲区,用于为了提高流的效率。

二、字符流

1.读写文件中的字符

FrileWriter中的一些方法:

write(Stringa);方法将字符串写到流中

flush();强制刷新流对像中的缓冲区中的数据。

close();关闭流资源,但是关闭之前会刷新一次内部的缓冲区中的数据;

FileReader字符输入流:用于读取已过滤的字符流的抽象类;

int read();方法每次读取一个字符,如果已到达流的末尾,则返回 -1

int read(char[] cbuf);将字符读入数组,返回读到字符的个数;

例子1:FrileWriter写入和读取文件中的文本数据,创建一个文件并写入一些字符数据。

public class Test1 {

    public static void main(String[] args) {

       try {

           //创建一个FileWriter对象,该对象一被初始化,指定读取文件路径

           Writer w=new FileWriter("D:/test.text");

           //写入一行数据

           w.write("第一行文本!");

           //刷新该流的缓冲。将数据刷新到文件中

           w.flush();

           //关闭资源

           w.close();

           int ch=0;

           //创建一个FileWriter对象,将文件里的内容读出

           Reader r=new FileReader("D:/test.text");

           //r.read()返回值不为-1的时候打印字符,如果为-1说明文件读取完毕

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

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

           }

          

           //关闭资源

           r.close();

          

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

    }

 

}

例子2:对已有文件进行续写,不覆盖当前文件的内容:

public class Test2 {

    // 对已有文件的数据进行续写

    public static void main(String[] args) {

       FileWriter fw = null;

       try {

           /* 传递一个true参数,代表不覆盖已有的文件,并在已有的文件末尾处进行数据续写 */

           fw = new FileWriter("d:/text.txt",true);

           fw.write("第二行数据!");

       } catch (IOException e) {

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

       } finally {

           try {

              fw.close();

           } catch (IOException e) {

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

           }

       }

    }

}

例子2:文件的复制

void write(buf,0,len);将字符写入数组的某一部分,此方法没有返回值,buf要写入的字符缓冲区,off从该处开始读取字符,len要写入字符的数量。

 

public class Test3 {

    public static void main(String[] args){

        FileWriter fw=null;

        FileReader fr=null;

        try{

            fw=new FileWriter("d:/text.txt");

            fr=new FileReader("c:/text.txt");

            //定义数组缓存大小

            char[] buf=newchar[1024];

            int len=0;

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

              //将文件写出

                fw.write(buf,0,len);

            }

        }catch(IOException e){

            throw new RuntimeException("读写失败");

        }finally{

            if(fw!=null)

            try{

              //关闭写出流

                fw.close();

            }catch(IOException e){

                throw new RuntimeException("写入关闭失败");

            }

            if(fr!=null)

                try{

                  //关闭写入流

                    fr.close();

                }catch(IOException e){

                    thrownew RuntimeException("读取关闭失败");

                }

        }

    }

}

2.字符缓冲区

字符缓冲区的作用:提高了字符读取效率。

相关类:BufferedWriterBufferedReader,缓冲区要结合流才能使用,是在流的基础上对流功能的增强。

例子:通过缓冲区复制Java文件

public class Test4 {

    public static void main(String[] args) {

       BufferedWriter bfw = null;

       BufferedReader bfr = null;

       try {

           //定义写入缓存区

           bfw = new BufferedWriter(new FileWriter("d:/text.java"));

           //定义写出缓冲区

           bfr = new BufferedReader(new FileReader("c:/text.java"));

           for(String line=null;(line = bfr.readLine()) !=null;)

           {

              bfw.write(line);

              //写入一个行分隔符,newLine是跨平台的

              bfw.newLine();

              //刷新缓存区的flush,即使关闭缓冲区

              bfw.flush(); 

           }

       } catch (IOException e) {

           throw new RuntimeException("复制文件失败");

       } finally {

           try {

              if (bfw !=null) {

                  bfw.close();

              }

           } catch (IOException e) {

              throw new RuntimeException("读取关闭失败");

           }

           try {

              if (bfr !=null) {

                  bfr.close();

              }

           } catch (IOException e) {

              throw new RuntimeException("写入关闭失败");

           }

       }

 

    }

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值