字符流
字符流
字符流的抽象基类:
Reader,Writer
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
字符流写入数据---FileWriter
//读、写都会发生 IO 异常
public static void main(String[] args) throws IOException {
//【1】创建一个FileWriter的对象。该对象一初始化就必须要明确被操作的文件(其实就是明确数据要存放的目的地)
(如果指定位置,出现了同名文件,文件会被覆盖)
FileWriter fw=new FileWriter("new.txt");
//【2】调用write的方法,将字符串写入流中
//(将数据变成流,方法就是管道,字符流通过管道输入指定文件)
fw.write("asdsfg");
//【3】flush()刷新缓冲区,将缓冲区中的数据刷到目的地文件中
//flush()就是将管道的字符流流全都推向目的地,只有刷新流的对象,目标文件才有数据
//在没有close()关闭流之前,流的对象还存在,可以继续追加write()写入
fw.flush();
//【4】close()关闭流,其实关闭的就是 java 调用的系统底层资源。在关闭前,会先刷新该流。
fw.close();
}
close()和 flush()的区别:
flush():将缓冲区的数据刷到目的地中后,流可以使用。
close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。注意,java在调用系统的资源来完成数据的建立,所以一定要释放资源
IO异常的基本处理方式
public static void main(String[] args) {
//【1】如果在try内创建FileWriter的对象,那么finally无法使用该对象
//【2】在外边创建引用,在try内初始化
FileWriter fw=null;
try {
fw=new FileWriter("new.txt");
fw.write("asdsfg");
} catch (IOException e) {
e.printStackTrace();
}
finally{
//使用finally关闭资源
try {
//【3】如果FileWriter的对象创建失败,会无法使用该对象关闭流,导致异常
if(fw!=null){
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
字符流读取数据---FileReader
第一种方式:read()单个字符单个字符读取(很麻烦)
//【1】创建一个文件读取流对象,和指定名称的文件相关联
//【2】要保证文件是已经存在,如果不存在,会发生异常FileNotFoundException
FileReader fr=new FileReader("new.txt");
//【3】调用读取流对象的read方法
//read()一次读取一个字符,而且指定往下读
int ch=0;
//【4】读取完数据,java就会返回-1
while((ch=fr.read())!=-1){
System.out.print((char)ch);//asdsfg
//读取的是 int类型97、115、100、115、102、103
//System.out.print(ch);
}
//【5】关闭流
fr.close();
read读取方式
第二种方式:(推荐)
read(char[])以数组存储数据返回存储字符的长度,
再通过String(char[],0,数组元素实际长度)将数组转换为字符串:
//【1】创建一个文件读取流对象,和指定名称的文件相关联
//要保证文件是已经存在,如果不存在,会发生异常FileNotFoundException
FileReader fr=new FileReader("new.txt");
//【2】定义一个字符数组。用于存储读到字符
//【3】该read(char[])返回的是读到字符个数
char[] buf=new char[1024];
//【4】初始化实际数组字符长度
int num=0;
//【5】读取完数据,java就会返回-1
while((num=fr.read(buf))!=-1){
/【6】/通过String()截取实际数组字符长度,读取数据
System.out.print(new String(buf,0,num));
}
//【7】刷新数据同时关闭流
fr.close();
复制文本文件
- 在D盘创建一个文件,用于存储C盘中的数据
- 定义读取流和C盘文件的关联
- 通过不断的读取完成数据存储
- 关闭资源
public static void copy(){
FileWriter fw=null;
FileReader fr=null;
try {
//【1】创建目的地(写入目标文件)
fw=new FileWriter("C:/Users/Administrator/Desktop/newcopy111.txt");
//【2】与已有文件关联(读取目标源文件)
fr=new FileReader("C:/Users/Administrator/Desktop/zzz.txt");
//【3】定义字符数组接收独处的字符
char[] buf=new char[1024];
//【4】初始化实际字符数组的长度
int count=0;
while((count=fr.read(buf))!=-1){
//【5】每次读取实际字符数组内的字符
fw.write(buf, 0, count);
}
} catch (IOException e) {
//一般读取文件失败,应该停止程序
throw new RuntimeException("读取失败!!!");
}
finally{
if(fr!=null){
try { fr.close();}
catch (IOException e) {e.getMessage();}
}
if(fw!=null){
try { fw.close();}
catch (IOException e) {e.getMessage();}
}
}
}