Java IO之字符流概述-2

在这里插入图片描述

字符流

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

字符输入流 【Reader】

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

在这里插入图片描述

文件字符输入流 【FileReader】

把硬盘文件中的数据以字符方式读取到内存中

下图是它的构造器
在这里插入图片描述
!!!使用方式!!!

public class Demo01Reader {

    public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("F:\\cccc.txt");
        // 存储读取1024个字符
        char[] chars = new char[1024];
        int len = 0;
        // 当读到文件结尾时候  len==-1
        while ((len = reader.read(chars)) != -1) {
            System.out.println(new String(chars, 0, len));
        }
        reader.close();
    }
}

!!!结果是正确的!!!

在这里插入图片描述

字符输出流 【Writer】

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

在这里插入图片描述

文件字符输出流 【FileWriter】

java.io.FileWriter 类是写出字符到文件的便利类,构造时使用系统默认的字符编码和默认字节缓冲区

下图是它的构造器

在这里插入图片描述
字符输出流使用重点:

  • 创建FileWriter对象,构造方法中绑定要写入数据的目的地
  • 使用FileWriter中的方法writer,把数据写入到内存缓冲中(字符转换为字节的过程)
  • 使用FileWriter中的方法flush,把内存缓冲区中数据,刷新到文件中
  • 释放资源(在此之前会把内存缓冲区中的数据刷新到文件中)

使用方式

public class Demo02Writer {

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

        Writer writer = new FileWriter("F:\\cccc.txt");
        writer.write("囧囧是世界上最漂亮的女孩");
        writer.close();

    }
}

写出成功,并替换之前文件的内容

在这里插入图片描述

关闭和了刷新

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

  • flush:刷新缓冲区,流对象可以继续使用
  • close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用
public class Demo02Writer {

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

        Writer writer = new FileWriter("F:\\cccc.txt");
        writer.write("囧囧是世界上最漂亮的女孩");
        writer.flush();
        writer.write("囧囧是世界上最漂亮的女孩-2");
        writer.close();

    }
}

在这里插入图片描述

注意:第一次调用flush() 方法会强制将缓冲区的数据写入到文件中,调用close之后遍不能继续写出数据!!!

续写和换行

类似FileOutputStream一样 有一个布尔类型的构造器
true 代表追加 false 代表不追加
在这里插入图片描述
!!!上代码!!!

public class Demo02Writer {

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

        Writer writer = new FileWriter("F:\\cccc.txt", true);
        writer.write("囧囧是世界上最漂亮的女孩" + "\r\n");
        writer.flush();
        writer.write("————囧囧是世界上最豆的女孩!" + "\r\n");
        writer.close();

    }
}

!!!结果为追加!!!

在这里插入图片描述

jdk 9 对比 jdk 7的写法

我们知道jdk7的写法 可以用 try…with…resource ,这里就不掩饰了很简单
接下来我们看一下jdk 9的新写法

!!!上代码 依旧是复制文件的例子!!!

public class Demo05FileInputStream {

    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream fis = new FileInputStream("F:\\cccc.txt");
        FileOutputStream fos = new FileOutputStream("F:\\dddd.txt");

		// jdk 9 的新语法,支持将流放入圆括号中,省略了finally关闭流的操作
        try (fis; fos) {
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("复制成功");

    }
}
发布了24 篇原创文章 · 获赞 33 · 访问量 2391

猜你喜欢

转载自blog.csdn.net/weixin_41241629/article/details/104336002