1 FileReader与FileWriter
1.1 文件字符流体系概述
FileReader 与 FileWriter均是字符流,即按照字符来操作JavaIO,其继承体系如下图:
1.2 FileReader构造方法与相关方法摘要
✌️ FileReader 构造方法摘要:
⭕️ FileReader 相关方法:
方法名 | 说明 |
read() | 每次读取单个字符,返回该字符,如果到文件末尾,则返回-1 |
read(char[]) | 批量读取多个字符到数组,返回读取到的字符数,如果到达文件末尾就返回-1 |
1.3 FileWriter构造方法与相关方法摘要
✌️ FileWriter 构造方法摘要:
⭕️ FileWriter 相关方法:
方法名 | 说明 |
writer(int) | 写入单个字符 |
writer(char[]) | 写入指定数组 |
writer(char[], off, len) | 写入指定数组的指定部分 |
writer(string) | 写入整个字符串 |
writer(string, off, len) | 写入字符串的指定部分 |
FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件中。
2 案例实操
2.1 FileReader案例
使用FileReader从story.txt读取内容,并在控制台显示。
1️⃣ 单个字符读取方式
import java.io.FileReader; import java.io.IOException; /** * @author 兴趣使然黄小黄 * @version 1.0 * 演示 FileReader 读取 story.txt */ public class FileReaderTest { public static void main(String[] args){ //创建流 FileReader fileReader = null; int data = 0; try { fileReader = new FileReader("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt"); //循环读取 while ((data = fileReader.read()) != -1){ System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源 try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2️⃣ 多个字符读取方式
import java.io.FileReader; import java.io.IOException; /** * @author 兴趣使然黄小黄 * @version 1.0 * 演示 FileReader 读取 story.txt */ public class FileReaderTest { public static void main(String[] args){ //创建流 FileReader fileReader = null; int readLen = 0; char[] buff = new char[8]; try { fileReader = new FileReader("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt"); //循环读取 while ((readLen = fileReader.read(buff)) != -1){ String str = new String(buff, 0, readLen); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源 try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2.2 FileWriter案例
使用FileWriter将“奇迹皆有始,当下即行动!”写入到 say.txt 文件中。
⌨️ 参考代码及结果:
import java.io.FileWriter; import java.io.IOException; /** * @author 兴趣使然黄小黄 * @version 1.0 * FileWriter使用案例 */ public class FileWriterTest { public static void main(String[] args) { //创建流 FileWriter fileWriter = null; try { fileWriter = new FileWriter("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\say.txt"); //写入数据 String str = "奇迹皆有始,当下即行动!"; fileWriter.write(str); } catch (IOException e) { e.printStackTrace(); } finally { try { //释放资源 fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } }
3 处理流
3.1 BufferedReader介绍及使用案例
BufferedReader继承于Reader
BufferedReader的作用是为其他字符输入流添加一些缓冲功能,是一种处理流也叫包装流。
🐱构造函数
BufferedReader(Reader in): 创建一个使用默认大小输入缓冲区的缓冲字符输入流
BufferedReader(Reader in, int sz): 创建一个使用指定大小输入缓冲区的缓冲字符输入流
使用BufferedReader读取文件,并显示在控制台
⌨️ 参考代码与结果:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * @author 兴趣使然黄小黄 * @version 1.0 */ public class BufferedReaderTest { public static void main(String[] args) { //创建缓冲流对象,套接在指定节点流基础上 BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader( new FileReader("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt")); //读取文件,按行读取效率高 //到达文件末尾,readLine方法返回null String line; while ((line = bufferedReader.readLine()) != null){ System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源,只需要关闭外层流即可 if (bufferedReader != null){ try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
3.2 BufferedWriter介绍及使用案例
将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串,存在用单个字符、数组、字符串作为参数的方法写入数据;
可以指定缓冲区大小,或者可以接受默认大小(8192个字符)。对于大多数用途,默认值足够大,说明该类存在一个常量值用作默认缓冲区大小同时也可以通过构造函数指定大小;
提供了一个newLine()方法,它使用平台自己的行分隔符概念,由系统属性line.separator定义。并非所有平台都使用换行符(’\ n’)来终止行。因此,调用此方法终止每个输出行比直接编写换行符更为可取。用于进行输出的时候做换行操作且自动适用平台的换行分隔符,而非自定义的,比较灵活;
通常,Writer会立即将其输出发送到基础字符或字节流。除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters。
使用BufferedWriter将“Hello,黄小黄!”写入到hxh.txt文件中。
⌨️ 参考代码与结果:
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; /** * @author 兴趣使然黄小黄 * @version 1.0 * 案例演示 */ public class BufferedWriterTest { public static void main(String[] args) { //创建字符输入缓冲流 BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\hxh.txt")); //内容写入 String str = "Hello, 黄小黄!"; bw.write(str); //插入换行符 bw.newLine(); } catch (IOException e) { e.printStackTrace(); } finally { //释放资源,只需要关闭外层流即可 if(bw != null){ try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
如果希望换行,则使用bw.newLine()方法进行操作,该方法会根据系统插入相应的换行符。
3.3 缓存文件拷贝
采用缓存字符流的方式,复制一份story.txt文件。
🐱 参考代码:
具体见注释
import java.io.*; /** * @author 兴趣使然黄小黄 * @version 1.0 * 字符缓存流复制文本文件演示 */ public class BufferedCopyTest { public static void main(String[] args) { String srcFilePath = "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt"; String destFilePath = "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story副本.txt"; BufferedReader br = null; BufferedWriter bw = null; try { //创建流对象 br = new BufferedReader(new FileReader(srcFilePath)); bw = new BufferedWriter(new FileWriter(destFilePath)); //读取,边读边写 String line = null; //readLine 读取一行的内容,但是没有换行符 while ((line = br.readLine()) != null){ bw.write(line); //插入换行符 bw.newLine(); //刷新 bw.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { //释放资源 try { if (br != null){ br.close(); } if (bw != null){ bw.close(); } } catch (IOException e) { e.printStackTrace(); } } } }