java基础(17)(字符流读写数据,Reader,Writer,FileReader,FileWriter,续写和换行)

IO字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

Reader

java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。

常用方法

abstract voidclose()
关闭该流并释放与之关联的所有资源。
intread()
读取单个字符。
intread(char[] cbuf)
将字符读入数组。
abstract intread(char[] cbuf, int off, int len)
将字符读入数组的某一部分。
intread(CharBuffer target)
试图将字符读入指定的字符缓冲区。

常用的已知子类

BufferedReader,  InputStreamReaderFileReader,

FileReader

用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。

FileReader 用于读取字符流。

构造方法

方法名说明
FileReader(File file)创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName)创建一个新的 FileReader ,给定要读取的文件的名称。

注意:当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream 。

读取数据(一次读取一个字节)

public class FileReaderDemo01 {
    public static void main(String[] args) throws IOException {
        /**
         *     FileReader(File file)
         *               在给定从中读取数据的 File 的情况下创建一个新 FileReader。
         *     FileReader(String fileName)
         *               在给定从中读取数据的文件名的情况下创建一个新 FileReader。
         */

        FileReader fileReader = new FileReader(new File("day150429\\a.txt"));
        FileReader fr = new FileReader("day150429\\bb.txt");
        int len;
        while ((len = fr.read()) != -1){
            System.out.println((char) len);
        }
        while ((len = fileReader.read()) != -1){
            System.out.println((char)len);
        }

        //释放资源
        fr.close();
    }
}

数据读取(一次读取一个数组)

public class FileReaderDemo02 {
    public static void main(String[] args) throws IOException {
        /**
         *  // int read(char[] cbuf)  : 一次读取一个字符数组
         */

        FileReader fileReader = new FileReader("day150429\\bb.txt");
        int len;
        char[] chars = new char[1024];
        while ((len = fileReader.read(chars)) != -1){

            //将字符数组转换成字符串
            System.out.println(new String(chars,0,len));
        }

        //
        fileReader.close();
    }
}

Writer

写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

常用已知子类

BufferedWriter,OutputStreamWriter,FileWriter,

常用方法

方法名说明
void write(int c)写入单个字符
void write(char[] cbuf)写入字符数组。
abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数
void write(String str)写入字符串
void write(String str, int off, int len)写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
void flush()刷新该流的缓冲。
void close()关闭此流,但要先刷新它。

FileWriter

用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。

文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。

FileWriter 用于写入字符流。

构造方法

方法名说明
FileWriter(File file)创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName)创建一个新的 FileWriter,给定要读取的文件的名称。

注意:当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。

写数据

public class FileWriterDemo01 {
    public static void main(String[] args) throws IOException {
        /**
         * FileWriter(File file)
         * void write(int c) 						  : 写入单个字符。
         * void write(char[] cbuf) 				  : 写入字符数组。
         * void write(char[] cbuf, int off, int len) : 写入字符数组的某一部分。
         * void write(String str) 					  : 写入字符串。
         * void write(String str, int off, int len)  : 写入字符串的某一部分。
         * void flush() 							  : 刷新该流的缓冲。
         * void close() 							  : 关闭此流,但要先刷新它。
         */
        FileWriter fw = new FileWriter("day150429\\w.txt");

        //void write(int c) 						  : 写入单个字符。
        fw.write(65);
        fw.write(97);
        fw.write('b');


        //void write(char[] cbuf) 				  : 写入字符数组。
        char[] chars = {'a','b','c','d'};
        fw.write(chars);

        //void write(char[] cbuf, int off, int len) : 写入字符数组的某一部分。
        fw.write(chars,0,3);

        //void write(String str) 					  : 写入字符串。
        String str = "opqrst";
        fw.write(str);
        //void write(String str, int off, int len)  : 写入字符串的某一部分。
        fw.write(str,0,2);

        fw.flush();
        fw.close();

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

        /**
         * 续写和换行
         *         FileWriter(File file, boolean append)
         */
        FileWriter fileWriter = new FileWriter(new File("day150429\\c.txt"));
        for (int i = 1; i <= 5; i++) {
            fileWriter.write(i+":"+"hello");
            fileWriter.write("\r\n");
        }
        fileWriter.close();
    }
}

flush与close之间的区别

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。

flush:刷新缓冲区,流对象可以继续使用

close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再使用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值