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


    字符流定义及基本用法

    同字节流一样,字符流也有两个抽象的顶级父类,分别是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("
    ");    //将输入语句换行
            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();
        }
    }

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

    学习中,博客都是自己学习用的笔记,持续更新改正。。。
  • 相关阅读:
    springmvc学习:处理方法返回值的可选类型
    【MongoDB for Java】Java操作MongoDB
    过滤器与拦截器
    摘录
    struts2中运用通配符(边学边记)
    微信:一款软件带起的微时代营销
    Php连接mysql处理中文乱码
    dui xiang yin yong
    hibernate数据的三种存在状态(只与事务有关)
    session机制
  • 原文地址:https://www.cnblogs.com/Tunan-Ki/p/11673038.html
Copyright © 2020-2023  润新知