什么是io流
(1)io流就是用于读取字符流数据的输入流和用于写入字符流数据的输出流。也就是对文件进行读写操作。(Java视角)
(2)Java JDK提供了两个抽象类对象Writer(输出流)和Reader(输入流)。
- 继承Writer类的子类必输实现其write(char [],int,int),flush()和close()三个方法。大多数子类都会对这些方法进行重写,以提高效率。
- flush()方法用于刷新缓冲流数据到文件(这以后写入的内容才能在文件中看到)。一般的,close()执行前会自动执行flush()方法。
- 继承Reader类的子类必须实现其read(char [],int,int)和close()两个方法。
- 这里对像InputStream和OutputStream这样的超类不做过多介绍,可以点击下面链接,提供一些这两个超类的一些子类在特定情况下的使用。像操作二进制文件,对象操作流程。
(https://blog.csdn.net/songfeng123456/article/details/104435939)
(3)输出流对象使用一般步骤:
- 创建输出流对象
- write()方法写入数据——写入字符数组或字符串对象
- flush()方法刷新缓冲区数据
- close()方法关闭输入流对象
(4) 输入流对象使用一般步骤
- 创建输入流对象
- 读取文件内容(这个在下面具体情况会具体介绍)
- close()方法关闭输出流对象
FileWriter类和FileReader类
(1)FileWriter类继承自Writer类的子类OutputStreamWriter类。FileReader类继承自Reader类的子类InputStreamReader类。自然要实现上面提到的必须实现的方法。
- FileWriter类常用的构造方法有FileWriter(String fileName) ——构造一个给定文件路径名称(文件后缀有效)的FileWriter对象,会在给定目录下产生一个指定文件名的文件;FileWriter(File file) ——传入一个File对象构造一个FileWriter对象。
如:FileWriter fWriter=new FileWriter(“C:\text.txt”); 会在C盘下生成一个text.txt文件(若文件不存在) - FileReader类常用的构造方法有FileReader(String fileName)——构造一个指定文件路径名称的FileReader对象,这个指定的文件必须存在; FileReader(File file) ——传入一个File对象构造一个FileReader对象。
如:FileWriter fReader=new FileReader(“text.txt”); 这里是绝对路径,会在项目文件夹下寻找是否存在text.txt文件。 - FileWriter和FileReader类操作字节流对象。
(2)FileReader类读取文件内容有两种方式,一种方式是一次读取一个字符,一种方式是一次读取一个字符数组。
实例 将项目文件夹下的text.txt的文件内容复制到copy.txt文件里面
public static void main(String[] args) throws IOException {
//创建I/O对象
FileWriter fWriter=new FileWriter("copy.txt");
//指定文件一定在系统中存在
FileReader fReader=new FileReader("text.txt");
//一次读取一个字符的方法读取字符串
int ch;
//读取text.txt文件内容到copy.txt
//判断文件中是否还有内容 没有内容read方法会返回-1
while((ch=fReader.read())!=-1) {
fWriter.write(ch);
}
//刷新缓冲区
fWriter.flush();
//一次读取一个字符数组的方式读取输入内容
/*char[] chs=new char[1024];
int len;
while((len=r.read(chs))!=-1) {
fWriter.write(chs);
fWriterflush();
}*/
//关闭I/O对象
fWriter.close();
fReader.close();
}
BufferedWriter类和BufferedReader类
(1)BufferedWriter类和BufferedReader直接继承自Writer类和Reader类。操作字符流对象。
- BufferedWriter对象的构造方法有BufferedWriter(Writer out) ,当然可以传入一个FileWriter对象,将字节输出流转为字符输出流。
- BufferedReader对象的构造方法有BufferedRead(Reader in),当然也可以传入一个FileReader对象,将字节输入流抓为字符输入流。
(2)个人认为,这两个类就是FileWriter类和FileReader的加强。其中 readLine()大大提高了写读速度。是对文件中的每一行进行操作。BufferedWriter在读取文件是还会实现自动刷新缓冲区。
实例 将项目文件夹下的text.txt的文件内容复制到copy.txt文件里面
private static void extracted_2() throws FileNotFoundException, IOException {
//创建输入流对象 将字节流转为字符流
BufferedReader br=new BufferedReader(new FileReader("text.txt"));
//创建输出流对象
BufferedWriter bw=new BufferedWriter(new FileWriter("copy.java"));
//复制文本
String line;
//判断文件某一行是否有数据
while((line=br.readLine())!= null) {
//写入一行数据
bw.write(line);
//换行
bw.newLine();
}
//释放资源
br.close();
bw.close();
}
PrintWriter类的使用
(1)PrintWriter类直接继承自Writer。将对象的格式表示打印到文本输出流。
(2)提供了比BufferedWriter类更方便读取数据的方法println()方法。
(3)常用的构造方法有PrintWriter(Writer out,boolean autoFlush) ——接收一个Writer对象创建一个PrintWriter对象,并确定是否打开自动刷新。(true打开自动刷新,false关闭自动刷新)
如:PrintWriter pw=new PrintWriter(new FileWriter(“Demo_2.java”,true));
实例 将项目文件夹下的text.txt的文件内容复制到copy.txt文件里面
public static void main(String[] args) throws IOException {
//创建快速输入流对象
BufferedReader br=new BufferedReader(new FileReader("text.java"));
//创建打印流对象 打开自动刷新
PrintWriter pw=new PrintWriter(new FileWriter("copy.txt",true));
//复制文件
String line;
while((line=br.readLine())!=null) {
pw.println(line);
}
//释放资源
pw.close();
br.close();
}
InputStreamReader类的使用
(1)InputStreamReader类直接继承自Reader类。对字符流进行操作。
(2)InputStreamReader类可以接收标准输入流参数 System.in(键盘录入数据)。
实例 将键盘录入的内容写入text.txt文件中
private static void extracted() throws IOException {
//创建输入流对象 将字节流转为字符流 接收标准输入流对象
Reader r=new InputStreamReader(System.in);
//创建输出流对象
FileWriter fw=new FileWriter("text.txt");
//一次读取一个字符数组的方式读取输入内容
char[] chs=new char[1024];
int len;
while((len=r.read(chs))!=-1) {
fw.write(chs);
fw.flush();
}
//释放资源
r.close();
fw.close();
}