缓冲字符流
缓冲字符输出流-java.io.PrintWriter
-
java.io.BufferedWriter和BufferedReader
-
缓冲字符流内部也有一个缓冲区,读写文本数据以块读写形式加快效率.并且缓冲流有一个特别的功能:可以按行读写文本数据.缓冲流内部维护一个char数组,默认长度8192.以块读写方式读写字符数据保证效率
-
java.io.PrintWriter具有自动行刷新的缓冲字符输出流,实际开发中更常用.它内部总是会自动连BufferedWriter作为块写加速使用.
工作原理
特点
-
可以按行写出字符串
-
具有自动行刷新功能
对文件写操作的构造器
PrintWriter(File file)
PrintWriter(String path)
还支持指定字符集
PrintWriter(File file,String csn)
PrintWriter(String path,String csn)
上述构造器看似PW可以直接对文件进行操作,但是它是一个高级流,实际内部会进行流连接:
this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName))),false);
如上面工作原理图
例
package io;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
/**
* 缓冲字符输出流:java.io.PrintWriter
* 特点:
* 1:按行写出字符串
* 2:具有自动的行刷新功能
*
*/
public class PWDemo {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
//向文件中写入文本数据
/*
PrintWriter(File file)
PrintWriter(String path)
*/
PrintWriter pw = new PrintWriter("pw.txt");
// PrintWriter pw = new PrintWriter("pw.txt", "UTF-8");
pw.println("我祈祷拥有一颗透明的心灵,和会流泪的眼睛。");
pw.println("给我再去相信的勇气,oh越过黄昏去拥抱你。");
System.out.println("写出完毕");
pw.close();
}
}
其他构造器
PritWriter(Writer writer)
将当前实例化的PrintWriter链接在指定的字符输出流上
PrintWriter(OutputStream out)
将当前实例化的PrintWriter链接在指定的字节输出流上
由于除了转换流外的其他字符流都不能直接连在字节流上,因此这个构造器内部会自动链接在BufferedWriter上
并且让BufferedWriter链接在转换流OutputStream上,最后再让转换流链接再指定的字节输出流上
例
package io;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* 自行完成流连接向文件写出字符串
*/
public class PWDemo2 {
public static void main(String[] args) throws FileNotFoundException {
//负责:将写出的字节写入到文件中
FileOutputStream fos = new FileOutputStream("pw2.txt");
//负责:将写出的字符全部转换为字节(可以按照指定的字符集转换)
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
//负责:块写文本数据(攒够8192个字符一次性写出)
BufferedWriter bw = new BufferedWriter(osw);
//负责:按行写出字符串
PrintWriter pw = new PrintWriter(bw);
pw.println("你停在了这条我们熟悉的街,");
pw.println("把你准备好的台词全念一遍。");
System.out.println("写出完毕");
pw.close();
}
}
自动行刷新
PrintWriter支持自动行刷新,每当我们调用println方法写出一行内容后自动flush一次。
对应的构造器
PritWriter(Writer writer,boolean autoflush)
如果第二个参数为true则开启自动行刷新
例
package io;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
* 实现一个简易的记事本工具
* 利用流连接
* 在文件输出流上最终链接到PrintWriter上。
* 然后将用户在控制台上输入的每一行字符串都可以按行写入到对应的文件中。
* 当用户在控制台上单独输入"exit"时程序退出。
*/
public class AutoFlushDemo {
public static void main(String[] args) throws FileNotFoundException {
//负责:将写出的字节写入到文件中
FileOutputStream fos = new FileOutputStream("note.txt");
//负责:将写出的字符全部转换为字节(可以按照指定的字符集转换)
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
//负责:块写文本数据(攒够8192个字符一次性写出)
BufferedWriter bw = new BufferedWriter(osw);
//负责:按行写出字符串
PrintWriter pw = new PrintWriter(bw,true);//开启自动行刷新
Scanner scanner = new Scanner(System.in);
System.out.println("请开始输入内容,单独输入exit退出");
while(true){
String line = scanner.nextLine();
//String可以忽略大小写比较字符串内容:equalsIgnoreCase
if("exit".equalsIgnoreCase(line)){
break;
}
pw.println(line);//每当println后自动flush。注意:print方法并不会自动flush
}
System.out.println("再见!");
pw.close();
}
}
缓冲字符输入流-java.io.BufferedReader
缓冲字符输入流内部维护一个默认8192长度的char数组,总是以块读取文本数据保证读取效率。
缓冲输入流提供了一个按行读取文本数据的方法
String readLine()
返回一行字符串。方法内部会连续扫描若干个字符,直到遇到换行符为止,将换行符之前的内容以一个字符串形式返回。
返回的字符串中不含有最后的换行符。
返回值有三种情况:
1:正常一行内容
2:空字符串。当读取了一个空行时(这一行只有一个换行符)。
3:null。当流读取到了末尾时。
当我们第一次调用readLine()时,流并不是只读取了一行字符串,而是先进行块读操作(一次性读取8192个字符并转入到内部的char数组中),然后扫描内部的char数组,然后将第一行字符串返回。第二次调用后再继续扫描后去的内容以此类推。
例
package io;
import java.io.*;
/**
* 使用缓冲字符输入流读取文本数据
*/
public class BRDemo {
public static void main(String[] args) throws IOException {
//将当前源代码输出到控制台上
/*
1:创建文件输入流读取当前源代码文件
2:进行流连接最终链接到BufferedReader上
3:读取每一行字符串并输出到控制台上
*/
FileInputStream fis = new FileInputStream(
"./src/main/java/io/BRDemo.java"
);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line;
while((line = br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
}