欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java IO之字符流概述-2

程序员文章站 2022-04-03 16:21:56
...

Java IO之字符流概述-2

字符流

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

字符输入流 【Reader】

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

Java IO之字符流概述-2

文件字符输入流 【FileReader】

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

下图是它的构造器
Java IO之字符流概述-2
!!!使用方式!!!

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();
    }
}

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

Java IO之字符流概述-2

字符输出流 【Writer】

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

Java IO之字符流概述-2

文件字符输出流 【FileWriter】

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

下图是它的构造器

Java IO之字符流概述-2
字符输出流使用重点:

  • 创建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();

    }
}

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

Java IO之字符流概述-2

关闭和了刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中,但是关闭的流对象,是无法继续写出数据的
如果我们即想写出数据,又项技术使用流,就需要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();

    }
}

Java IO之字符流概述-2

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

续写和换行

类似FileOutputStream一样 有一个布尔类型的构造器
true 代表追加 false 代表不追加
Java IO之字符流概述-2
!!!上代码!!!

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();

    }
}

!!!结果为追加!!!

Java IO之字符流概述-2

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("复制成功");

    }
}
相关标签: Java