Java学习第十六天

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:\temp.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;
  }
}

posted on 2019-08-25 22:27  small_slag  阅读(225)  评论(0编辑  收藏  举报

导航