简介
java将流按照读写单位划分为字节流与字符流.
java.io.InputStream和OutputStream是所有字节流的超类
而java.io.Reader和Writer则是所有字符流的超类,它们和字节流的超类是平级关系.
Reader和Writer是两个抽象类,里面规定了所有字符流都必须具备的读写字符的相关方法.
字符流最小读写单位为字符(char),但是底层实际还是读写字节,只是字符与字节的转换工作由字符 流完成. 字符流都是高级
字符流的父类
java.io.Writer 所有字符输入流的超类
void write(int c):写出一个字符,写出给定int值”低16”位表示的字符。
void write(char[] chs):将给定字符数组中所有字符写出。
void write(String str):将给定的字符串写出
void write(char[] chs,int offset,int len):将给定的字符数组中从offset处开始连续的
len个字符写出
java.io.Reader 所有字符输出流的超类
int read():读取一个字符,返回的int值“低16”位有效。当返回值为-1时表达流读取到了末尾。
int read(char[] chs):从该流中读取一个字符数组的length个字符并存入该数组,返回值为实际
读取到的字符量。当返回值为-1时表达流读取到了末尾。
了解即可,接下来深入的学习比较常用的缓冲字符输出流
缓冲字符输出流
缓冲字符输出流-java.io.PrintWriter
常用构造器
PrintWriter(String filename) :可以直接对给定路径的文件进行写操作
PrintWriter(File file):可以直接对File表示的文件进行写操作
PrintWriter(OutputStream out):将PW链接在给定的字节流上(构造方法内部会自行完成转换流等流连接)
PrintWriter(Writer writer):将PW链接在其它字符流上
PrintWriter(OutputStream out,boolean autoflush)
PrintWriter(Writer writer,boolean autoflush) 上述两个构造器可以在链接到流上的同时传入第二个参数,如果该值为true则开启了自动行刷新功能。(谨慎开启,会降低性能)
代码实例
自行完成转换流等流连接
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
public class PWDemo1 {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
PrintWriter pw=new PrintWriter("pw.txt", "UTF-8");
pw.println("你好");
pw.println("再见");
pw.close();
}
}
手动流链接
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("pw2.txt"))));
pw.println("b");
pw.println("再见");
pw.close();
简易记事本 (应用)
PrintWriter pw = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("note2.txt", true), StandardCharsets.UTF_8)),true);
Scanner sc = new Scanner(System.in);
System.out.println("请输入要写入记事本中的内容:");
String data = sc.nextLine();
while (!"exit".equals(data)) {
pw.println(data);
System.out.println("请继续输入");
data = sc.nextLine();
}
pw.close();
System.out.println("输入结束");
缓冲字符输入流-java.io.BufferedReader
内部原理
缓冲字符输入流内部维护一个默认8192长度的char数组,总是以块读取文本数据保证读取效率。 缓冲输入流提供了一个按行读取文本数据的方法
String readLine() 返回一行字符串。方法内部会连续扫描若干个字符,直到遇到换行符为止,将换行符之前的内容以一个字符串 形式返回。 返回的字符串中不含有最后的换行符。 返回值有三种情况:
1:正常一行内容
2:空字符串。当读取了一个空行时(这一行只有一个换行符)。
3:null。当流读取到了末尾时。
当我们第一次调用readLine()时,流并不是只读取了一行字符串,而是先进行块读操作(一次性读取8192个 字符并转入到内部的char数组中),然后扫描内部的char数组,然后将第一行字符串返回。第二次调用后再继 续扫描后去的内容以此类推。
代码实例
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./src/main/java/io/BRDemo.java")));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
输出文件目录内的文件内容(应用)
public static void main(String[] args) throws IOException {
File dir = new File("./src/main/java/io");
File[] files = dir.listFiles();
int num = 0;
for (File f : files) {
printFile(f);
}
}
public static void printFile(File file) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}