字节流两个基类
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
以前是通过继承将每一个子类都具备缓冲功能。
那么继承体系会复杂,并不利于扩展。
现在优化思想。单独描述一下缓冲内容。
将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
这样继承体系就变得很简单。优化了体系结构。
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
*/