Java IO(四)转换流字符流、缓冲字符流BufferedReader

1.转换流

  • PrintWriter提供了直接对文件做写操作的构造器
    • PrintWriter(File file)
    • PrintWriter(String path)

java.io.PrintWriter是具有自动行刷新的缓冲字符输出流(内部总是连接着BufferedWriter作为缓冲加速部分)。而PW自身特点是可以按行写出字符串且具有自动行刷新功能[参数为File和String是不具有刷新功能的]。

常用方法

print() 方法输出字符串后不带换行符
println() 方法输出字符串后带换行符

图解如下

Java IO(四)转换流字符流、缓冲字符流BufferedReader_第1张图片

代码如下

直接使用
//字符集参数可不带,默认使用系统的字符集,如果写错会运行时会报异常
public class PWDemo {
    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
        PrintWriter pw=new PrintWriter("pw.txt","utf-8");
        pw.println("白风车 想谁呢");
        pw.println("听风说,它走了");
        pw.close();
    }
}
嵌套其他流
public class PWDemo2 {
    public static void main(String[] args) throws FileNotFoundException {
        //文件输出流(低级流,字节流) 作用:向文件中写出字节
        FileOutputStream fis=new FileOutputStream("pw2.txt");
        //转换输出流(高级流,字符流) 作用:1.衔接字符与字节流的 2.将写出的字符转换为字节
        OutputStreamWriter osw=new OutputStreamWriter(fis,StandardCharsets.UTF_8);
        //缓冲字符输出流(高级流,字符流) 作用:块写文本数据加速的(内有一个8k的char数组),也可以自行定义
        BufferedWriter bw=new BufferedWriter(osw,1024*10);
        //具有自动行刷新功能(高级流,字符流) 作用:1.按行写出字符串(println) 2.自行刷新(设置为true)
        PrintWriter pw=new PrintWriter(bw,true);
        
        String line;
        line="天青色等烟雨";
        pw.println(line);
        line="而我在等你";
        pw.println(line);
//        pw.close();
    }
}
小例:完成一个简易记事本工具

将控制台上输入的每一行字符串按行写入到该文件中,如果单独输入exit,则程序退出。

public class PWDemo2 {
    public static void main(String[] args) throws FileNotFoundException {
        PrintWriter pw=new PrintWriter("pw2.txt");
        Scanner sc=new Scanner(System.in);
        //写法1
        /*String line = sc.nextLine();
        while (!"exit".equals(line)){
            pw.println(line);
            pw.flush();
            line=sc.nextLine();
        }*/
        //写法2
        while (true){
            String line=sc.nextLine();
            if("exit".equals(line)){
                break;
            }
            pw.println(line);
            pw.flush();
        }
        System.out.println("写出完毕");
        pw.close();
        }
}

构造方法源码解析

代码如下

 public PrintWriter(String fileName) throws FileNotFoundException {
        this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName))),
             false);
    }

图解如下

Java IO(四)转换流字符流、缓冲字符流BufferedReader_第2张图片

2.缓冲字符流(是一对高级流)

java.io.BufferedWriter和BufferedReader
缓冲字符流内部也有一个缓冲区,写文本数据以块形式加快效率,并且缓冲流有一个特别的功能:可以按行读写文本数据
缓冲流内部维护这一个char数组,默认长度8k,以块读方式读写字符数据保证效率
java.io.PrintWriter则是自动行刷新的换成字符输出流(实际缓冲功能是靠BufferedWriter实现的,它的内部总是连接着这个流)

BufferedReader

  • 块读文本数据加速
  • 可以按行读取字符串

readLine()方法

作用:读取一串字符串。连续读取若干字符直到遇到换行符位置,并将换行符之前的内容返回。
注意:返回的字符串里不包含最后的换行符
特殊情况:
如果这一行只有一个换行符,那么返回值为空字符串:“”
如果读到了流的末尾,那么返回值为null
实际运行时:
当我们第一次调用readLine()方法时,缓冲字符输入流实际会一次性读取8k的char回来并存入内部的char数组中(块读文本操作)。
readLine方法只将char数组中从头开始一直到第一个换行符位置的内容以一个字符串形式返回。

public String readLine() throws IOException

读取一个文本行。通过下列字符之一即可认为某行已终止:换行 (‘\n’)、回车 (‘\r’) 或回车后直接跟着换行。
返回:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
抛出:IOException - 如果发生 I/O 错误

3.flush()方法

java中所有的输出流(无论是字符还是字节流)都支持flush方法
不过只有缓冲流的flush是真是将自身缓冲区中的缓存数据做强制写出的
而其他高级流中flush方法的实现仅仅是调用其他连接流的flush,将该动作传递下去

IO总结图

Java IO(四)转换流字符流、缓冲字符流BufferedReader_第3张图片

你可能感兴趣的:(API,java)