Java从零开始学三十六(JAVA IO- 字符流)

时间:2024-06-24 22:06:08

一、字符流

BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中
BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的满时,再把缓冲区的内容写到字符输出流中

二、对文本文件的读写

2.1、字符输入流

Java从零开始学三十六(JAVA IO- 字符流)

2.2、字符输出流

Java从零开始学三十六(JAVA IO- 字符流)

2.3、综合使用

package com.pb.io.buffered;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class BufereTest {
/*BufferedWriter
* 1.需要修饰到一个指定的输出流(例如:FileWriter)还可以是其它的
* 2.BufferedWriter会覆盖原有文件内容
* 3.需要清空缓冲区,使用flush()方法
* BufferedReader
* 1.需要修饰到一个指定的输入流(例如:FileReader)还可以是其它的
* 2.关闭流
*/
public static void main(String[] args) {
/*
* BufferedWriter写操作
*/
try {
//1.创建文件输出流FileWriter
FileWriter fw=new FileWriter("d:/test/test.txt");
//这里没有加true,是清空文件重新写入,可以加入true
//2.实例化。BufferedWriter对象包装类
BufferedWriter bw=new BufferedWriter(fw);
//3.写入内容
bw.write("大家好!");
bw.write("我要修改内容了");
bw.newLine(); //换行
bw.write("哈哈,我修改完了!");
bw.newLine();
//4.清空缓冲区
bw.flush();
//5.关闭流
bw.close();
fw.close();
System.out.println("==========写入文件结束======");
} catch (IOException e) {
e.printStackTrace();
}
/*
* BufferedReader读文件
*/ try {
//1.声明文件读取对象
FileReader fr=new FileReader("d:/test/test.txt");
//2.声明BufferedRead对象
BufferedReader br=new BufferedReader(fr);
//3.开始读取文件
System.out.println("========开始读取文件========");
String date;
while((date=br.readLine())!=null){
System.out.println(date);
}
System.out.println("========读取文件结束========");
//4.关闭流
br.close();
fr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

结果:

==========写入文件结束======
========开始读取文件========
大家好!我要修改内容了
哈哈,我修改完了!
========读取文件结束========

三、字节-字符转换流

  • OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流输出对象。
  • InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。
 
FileOutputStream是OutputStream 的直接子类,FileInputStream也是InputStream的直接子类,
但是在字符流文件的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,
而FileReader也不直接是Reader的子类,是InputStreamRader的子类,
那么从这两个类的继承关系就可以清楚的发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入输出流的。

例1.实现文本文件的复制

s1.txt内容

明月几时有,
把酒问青天,
不知道天上宫阙,
今夕是何年。
package com.pb.io.buffered;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; /*
* 实现文本文件的复制
*使用BufferedReader和BufferedWriter来实现
*/
public class BuffereDemo1 { public static void main(String[] args) { try {
//1.声明BufferedReader和BufferedWriter对象
InputStreamReader isr=new InputStreamReader(new FileInputStream("d:/test/s1.txt"), "GB2312"); //解决中文乱码
//FileReader fr=new FileReader("d:/test/s1.txt");
BufferedReader br=new BufferedReader(isr); OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("d:/test/s2.txt"),"GB2312");
//FileWriter fw=new FileWriter("d:/test/s2.txt"); //s2并不存在,会自动创建
BufferedWriter bw =new BufferedWriter(osw);
//2.开始读取文件
String line; //声明变量用来用来存放读出的内容
int num=1;//用来记录行数
while((line=br.readLine())!=null){
System.out.println("=========正在读出第"+num+"行===========");
System.out.println(line);
System.out.println("=========正在写入第"+num+"行===========");
bw.write(line);
num++;
} System.out.println("======文件写入结束========");
//清空缓冲区
bw.flush();
//关闭输出流
bw.close();
osw.close();
System.out.println("======文件读取结束========");
//关闭输入流
br.close();
isr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }