字符流数据的写出和读取
写出数据 FileWriter
路径下没有文件,会创建文件,如果该文件已存在,会被覆盖
FileWriter write = new FileWriter(“E:\\a.txt”);
写出数据
流程:数据—>缓冲区满了>文件 //缓冲区满了才会将数据写入文件
wirter.write(“abc”); //当数据比较少,写到缓冲区,缓冲区还没满程序已经结束,所以不会写出数据
冲刷缓冲区,把还未写满数据的缓冲区冲刷出去,数据就会写入文件
writer.flush();
输出流使用完之后,要进行关流操作,以防程序占用内存而导致其它程序不能调用
writer.close(); //关流之前会自动做一次冲刷缓冲区的操作
释放资源
writer = null;
写出数据过程中异常的处理
package cn.jay.exer; import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) { //一、将流对象放到try之外定义并且赋值为null,放到try内创建 //流对象try外定义是为了防止finally中不能调用writer FileWriter writer = null; try { writer = new FileWriter("E:\\a.txt"); writer.write("abc"); //四、写完数据之后需要手动冲刷一次缓冲区,防止关流失败后数据在内存中得不到释放 writer.flush(); } catch (IOException e) { e.printStackTrace(); } finally { //二、关流之前需要判断是否为空,如果为空,null.close无意义 if (writer != null) try { writer.close(); } catch (IOException e) { e.printStackTrace(); } finally { //三、关流之后要将对象强制置为null,释放内存占用 writer = null; } } } }
读取数据 FileReader
FileReader没有缓冲区,需要手动提供一个字符数组作为缓冲区来使用
import java.io.FileReader; import java.io.IOException; public class FileInputStreamDemo { public static void main(String[] args) throws IOException { //一次读取一个字符 FileReader reader = new FileReader("E:\\a.txt"); //定义一个变量用来记录每次读取到的字符 int i = -1; //该read的返回值表示这一次读取到的字符 while((i = reader.read()) != -1){ System.out.println((char)i); } reader.close(); /* //一次读取多个字符 FileReader reader = new FileReader("E:\\a.txt"); //设置为每次存储10个字符 char[] c = new char[10]; //定义一个变量用来记录每次读取到的字符个数,给变量len赋初值(可以是任意值) //防止read读取数据失败导致报错 int len = -1; //该read的返回值表示这一次读取到的字符的个数 while((len = reader.read(c))!=-1) System.out.println(new String(c,0,len)); reader.close(); */ } }
引入BufferReader之后:
FileReader 读取数据
BufferReader 提供缓冲区
BufferReader reader = new BufferReader(new FileReader(“E:\\a.txt”)); //装饰设计模式 //读取一行数据 //String str = reader.readLine(); //初始化 String str = null; //读取数据,按行读取,读到null,停止 while((str = reader.readLine()) != null){ System.out.println(str); } //关流 reader.close();
装饰设计模式(以FileReader和BufferedReader为例)
利用同类对象(FileReader)构建自己对象本身(BufferedReader),对对象(BufferedReader)身上的功能做了增强或者改善
注:Java中原生的字符流只能操作字符类文件,但不能读取office组件