JAVA 18 (IO流之字符流)

字节流两个基类
InputStream
OutputStream
 
字符流的两个基类
Reader
Writer
 
这四个抽象类派生出来的子类都是以其父类名作为子类后缀的
 
 
字符流:
 
Writer
以操作文件为主来演示
创建一个文件并写入数据。
子类的后缀名是父类名,前缀名是功能。
 
FileWriter fw = new FileWriter("C:\\Users\\zx\\Desktop\\demo.txt");
//创建文件,明确数据要存放的目的地,如果已存在文件,则覆盖文件。 
 
fw.write("abcde"); 
//其实数据写入到了流当中,write可以多种形式写入数据。 
 
fw.flush(); 
//刷新流对象缓冲中的数据 
//将流中数据刷入到文件中
 
 fw.close();
//关闭流,并刷新它,一定要close
 
write()
flush()
close()
都要处理异常,具体方式为:
import java.io.*;
import java.util.*;
public class Test {
 public static void main(String[] args) throws IOException
 {
  FileWriter fw = null;//在外部创建引用,在内部new实体
  try
  {
  fw = new FileWriter("C:\\Users\\zx\\Desktop\\demo.txt");
  fw.write("abcde");
  fw.flush();
  }
  catch(IOException e)
  {
   sop(e.toString());
  }
  finally
  {
   try
   {
    if(fw!=null)  //注意
    fw.close();
   }
   catch(IOException e)
   {
   }
  }
 }
 public static void sop(Object obj)
 {
  System.out.println(obj);
 }
}
 
Reader
Read()
close()
 
FileReader fr = new FileReader("C:\\Users\\zx\\Desktop\\demo.txt");
  //创建一个文件读取流对象,和指定文件相关联
  //要保证文件已经存在,如果不存在,抛出文件未找到异常
 
  int ch = fr.read();
  //read方法一次读取一个字符,而且会自动往下读取。如果读取到结尾,则返回-1
 
  sop((char)ch);
  fr.close();
  //调用读取流对象方法
 
int a = fr.read(char[] s);//int为读取到的字符数。
 
读取字符串:
 
 
 
字符流的缓冲区
 
缓冲区的出现时为了提高流操作效率而出现的,所以创建缓冲区之前,必须有流对象。
BufferedWriter:构造方法必须有参数。提供流对象
BuffereReader:构造方法必须有参数。提供流对象
 
BufferedWriter举例说明
FileWriter fw = new FileWriter("C:\\Users\\zx\\Desktop\\buf.txt"); 
  BufferedWriter bf=new BufferedWriter(fw);
  //为了提高效率将流对象作为参数传递给缓冲区构造函数即可
 
  //缓冲区也是Writer子类
  bf.write("abcde");
 
  //使用缓冲区,就要刷新
  bf.flush();
 
  bf.newLine();//换行。是跨平台的
 
  bf.write("abcde");
 
  //关闭缓冲区,就是关闭了流对象
  bf.close();
 
 
 
BuffereReader举例说明:
 
//建立读取流对象
  FileReader fw = new FileReader("C:\\Users\\zx\\Desktop\\buf.txt");
 
  //为了提高效率,加入缓冲技术。将对象传入构造函数。
  BufferedReader br = new BufferedReader(fw);
 
  int a = br.read();//读一个字符 ,读到结尾返回-1
  String b = br.readLine();//读一行字符串, 读到结尾返回null。
 
  sop(a);
  sop(b);
 
  br.close();
 
 
装饰设计模式
 
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的类成为装饰类。
装饰类通常会通过构造方法接受被装饰对象,并基于被装饰对象的功能提供更强的功能。
 
装饰和继承的区别:
/*
 
 
MyReader//专门用于读取数据的类。
 |--MyTextReader
  |--MyBufferTextReader
 |--MyMediaReader
  |--MyBufferMediaReader
 |--MyDataReader
  |--MyBufferDataReader
 
class MyBufferReader
{
 MyBufferReader(MyTextReader text)
 {}
 MyBufferReader(MyMediaReader media)
 {}
}
上面这个类扩展性很差。
找到其参数的共同类型。通过多态的形式。可以提高扩展性。
 
class MyBufferReader extends MyReader
{
 private MyReader r;
 MyBufferReader(MyReader r)
 {}
}
 
 
MyReader//专门用于读取数据的类。
 |--MyTextReader
 |--MyMediaReader
 |--MyDataReader
 |--MyBufferReader
 
 
以前是通过继承将每一个子类都具备缓冲功能。
那么继承体系会复杂,并不利于扩展。
 
现在优化思想。单独描述一下缓冲内容。
将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
这样继承体系就变得很简单。优化了体系结构。
 
 
 
 
 
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
 
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
 
 
 
 
*/
 
 
 

 

posted @ 2015-09-30 16:44  hitz&x  阅读(122)  评论(0编辑  收藏  举报