1.Writer:字符输出流
Writer:
FileWriter
BufferedWriter:newLine()//换行
简单步骤:
FileWriter fw=new FileWriter("e:\t.txt");
fw.write("hello");//写入到内部的缓冲区,是一个字节数组
fw.flush();
2.字符输出流4步:
1:创建文件输出流对象和文件相关联
//文件可以事先存在也可以不存在,如果不存在会自动创建
FileWriter fileWriter=new FileWriter("temp.txt");
//2:使用文件输出流对象向文件中写入数据,每次都从文件的开头写入
fileWriter.write("abc");//因为需要有一个查表的过程,所以数据先写入到流对象内部的缓冲区了
//3.把缓冲区中的数据刷到文件中
//fileWriter.flush();
fileWriter.write("ef");
//关闭流
fileWriter.close(); //关闭流时会先刷新
//fileWriter.write("ef");关闭流不能再写入数据
标注:写入换行的方式:
方法1; newLine()
方法2: Properties pro=System.getProperties();
String line= pro.getProperty("line.separator");//得到系统换行符
FileWriter fw = new FileWriter("temp.txt");
fw.write("hello");//每次都从文件的开头写入
//向文件中写入换行
fw.write(line);
3.Reader:字符输入流
FileReader
BufferedReader: readLine()----返回的一行不包括换行符,所以要自己换行newLine()
4.字符流输入3步:
//读取一个文本文件
//因为是文本所以使用字符流,又因为是读取,所以使用Reader,又因为读取的是文件,所以
//使用Reader的可以读取文件的子类:FileReader
//先确定使用字符流还是字节流,再确定是输出流还是输入流,最后确定设备
1.创建字符读取流对象和被读取的文件相关联
//被读取的文件需要存在
FileReader fr = new FileReader("temp.txt"); // FileNotFoundException
2.读取
//int read() 一次读一个字符 :每次都从磁盘上取,效率低
//因为read()读到最后,如果读不到内容了,返回-1
int num=0;
while((num=fr.read())!=-1){
System.out.print((char)num);
}
3.//关闭流
fr.close();
5.FileReader类中read()方法的优化:
定义一个char型数组,接收读出的单个字符,然后当数组满了,就返回给内存
FileReader fr = new FileReader("temp.txt");//FileNotFoundException
char[] arr=new char[1024];
int num=0;
while((num=fr.read(arr))!=-1)//从磁盘上读取时仍然是一个一个的读,当数组存满时再返回
{
String str=new String(arr,0,num);
System.out.print(str);
}
6.因为在读写过程中都会抛出异常:IOException 或 NullPointerException 或 FileNotFoundException
所以要接收处理异常
1 例1: 2 FileReader fr=new FileReader("tt.txt"); 3 4 int ch = fr.read(); 5 6 读到末尾:-1 7 8 char[] arr=new char[1024]; 9 int num=0; 10 while((num=fr.read(arr))!=-1) 11 { 12 System.out.print(new String(arr,0,num)); 13 } 14 15 try{ 16 }catch(IOException e){ 17 18 }finally{ 19 20 if(fr!=null) 21 fr.close(); 22 }
1 例2: 2 import java.io.*; 3 class Demo1 4 { 5 public static void main(String[] args) 6 { 7 FileWriter fileWriter=null; 8 9 try{ 10 11 //java.io.FileNotFoundException: h: emp.txt (系统找不到指定的路径。) 12 fileWriter = new FileWriter("temp.txt");//文件创建失败,那么FileWriter对象也会创建失败 13 14 fileWriter.write("abc"); 15 16 }catch(IOException e){ 17 18 e.printStackTrace(); 19 20 }finally{ 21 try{ 22 //null.close() java.lang.NullPointerException 23 if(fileWriter!=null) 24 fileWriter.close();//必须执行,不一定能执行 25 26 }catch(IOException e){ 27 28 e.printStackTrace(); 29 } 30 } 31 } 32 }
7.缓冲流:
字符流的缓冲区:缓冲区只是为了提高读写的效率
缓冲区不具备读写的功能
使用缓冲区必须结合着读取流或写入流
缓冲读取流:BufferedReader: 有一个实现了一次读一行的功能 String readLine()(注意:读到末尾时返回null)
缓冲写入流:BufferedWriter: 有一个实现了跨平台的newLine()方法
8.使用缓冲流向文本文件中写入数据
1.因为缓冲流不具备写入的功能,所以需要先创建文件输出流对象
FileWriter fw = new FileWriter("tt.txt");//用于向文件中写入数据
2:为了提高写入的效率,使用输出缓冲流
把需要提高效率的输出流对象传递给缓冲流对象的构造方法
BufferedWriter bw = new BufferedWriter(fw);
3.使用缓冲输出流对象操作文件
for(int i=1;i<=5;i++)
{
bw.write("java"+i);
bw.newLine();//写入换行
bw.flush();
}
//关闭流
//关闭缓冲流就是关闭文件输出流对象
bw.close();
使用缓冲流从文本文件中读取数据
//因为缓冲流不具备读的功能,所以需要先创建文件读取流对象
FileReader fr = new FileReader("tt.txt");
//为了提高读取的效率,创建缓冲读取流对象
BufferedReader br = new BufferedReader(fr);
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
9.装饰设计模式:基于已经存在的功能提供更强大的功能 (了解:java设计模式一共有23种)
装饰设计模式的由来:
MediaReader
FileReader
提高读取的效率:
Reader
MediaReader
----BufferedMediaReader
FileReader
----BufferedFileReader
OtherReader
----BufferedOtherReader
当有很多Reader子类的时候,这个体系会越来越庞大
所以既然都是提高效率的,那么就把这个功能提取出来,谁需要被提高效率就把谁传过去
Reader
MediaReader
FileReader
OtherReader
BufferedReader ---装饰类也属于这个体系
class BufferedReader
{
private Reader r;
public BufferedReader(Reader r)
{
this.r=r;
}
}