相对内存的文件操作字符流

字符流定义及基本用法

同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader和Writer。其中,Reader是字符输入流,用于从某个源设备读取字符。Writer是字符输出流,用于向某个目标设备写入字符。

字符流的继承关系与字节流的继承关系有些类似,很多子类都是成对(输入流和输出流)出现的。其中,FileReaderFileWriter用于读写文件,BufferedReaderBufferedWriter是具有缓冲功能的流,使用他们可以提高读写效率。

字符流操作文件

在程序开发中,经常需要对文本文件的内容进行读取,如果想从文件中直接读取字符,便可使用字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。

接下来通过一个案例来学习如何使用FileReader读取文件中的字符。

public class Example01 {
    public static void main(String[] args) throws IOException {
        //创建一个FileReader对象用来读取文件中的字符
        FileReader reader = new FileReader("reader.txt");
        int ch;     //定义一个变量用于记录读取的字符
        while((ch=reader.read())!=-1) {        //判断循环是否读取到文件的末尾
            System.out.print((char)ch);        //不是字符流末尾就转为字符打印
        }
        reader.close();     //关闭文件读取流,释放资源
    }
}

如果想要向文件中写入字符就需要使用FileWriter类,该类是Writer的一个子类

接下来通过一个案例来学习如何使用FileWriter将字符写入文件

public class Example02 {
    public static void main(String[] args) throws Exception {
        //创建一个FileWriter对象用于向文件中写入数据
        FileWriter writer = new FileWriter("writer.txt");
        String str="小七是个大男人";
        writer.write(str);        //将字符串传入到文本文件中
        writer.write("\r\n");    //将输入语句换行
        writer.close();     //关闭写入流,释放资源
    }
}

FileWriter同FileOutputStream一样,如果指定的文件不存在,就会先创建文件,再写入数据,如果文件存在,则会首先清空文件中的内容,再进行写入。如果想在文件末尾追加数据,同样需要调用重载的构造方法。

FileWriter writer = new FileWriter("writer.txt",true);

字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter,利用包装流可以有效的提高读写数据的效率。其中BufferedReader是对字符输入流进行包装,BufferedWriter用于对字符输出流进行包装。需要注意的是,在BufferedReader中有一个重要的方法readLine(),该方法用于一次读取一行文本。

接下来通过一个案例来学如何使用包装流实现文件的拷贝

public class Example03 {
    public static void main(String[] args) throws Exception {
        //创建一个BufferedReader缓冲流对象
        BufferedReader reader = new BufferedReader(new FileReader("src.txt"));
        //创建一个BufferedWriter缓冲流对象
        BufferedWriter writer = new BufferedWriter(new FileWriter("desc.txt"));
        String str;
        while((str=reader.readLine()) != null) {
            writer.write(str);
            writer.newLine();
        }
        reader.close();
        writer.close();
    }
}

readLine()方法会逐个读取字符,当读到回车或者换行符时会将读到的字符作为一行内容返回。

需要注意的是,由于字符缓冲流内部使用了缓冲区,在循环中调用BufferedWriter的write()方法写入字符时,这些字符会首先被写入缓冲区,当缓冲区写满时或者调用close()方法时,缓冲器中的字符才会被写入目标文件。因此在循环结束时一定要调用close()方法,否则极有可能会导致部分缓存区中的数据没有被写入目标文件。

转换流

IO流可分为字节流和字符流,有时字节流和字符流之间也需要进行转换。在JDK中提供了两个类可以将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。

InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符出入流,方便直接读取字符。OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。

接下来通过一个案例来学习如何将字节流转成字符流。为了提高读写效率,可以通过BufferedReader和BufferedWriter来实现转换工作

public class Example01 {
    public static void main(String[] args) throws Exception {
        FileInputStream in = new FileInputStream("src.txt");    //创建字节输入流
        //将字节输入流转换成字符输入流
        InputStreamReader isr = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(isr);    //赋予字符流对象缓冲区
        FileOutputStream out = new FileOutputStream("des.txt");
        //将字节输出流转换成字符输出流
        OutputStreamWriter osw = new OutputStreamWriter(out);
        BufferedWriter bw = new BufferedWriter(osw);    //赋予字符输出流对象缓冲区
        String str;
        while((str=br.readLine())!=null) {        //判断是否读到文件末尾
            bw.write(str);        //输出读取到的文件
        }
        br.close();
        bw.close();
    }
}

程序实现了字节流和字符流之间的转换,将字节流转换为字符流,从而实现直接对字符的读写。需要注意的是,使用转换流时,只能针对操作文本文件的字节流进行转换,如果字节流操作的是一张图片,此时转换为字符流就会造成数据丢书。

posted @ 2019-10-14 18:22  tunan96  阅读(236)  评论(0编辑  收藏  举报