按流向分类
输入、输出流
按操作数据分
字节流、字符流
字节流基类
InputStream OutPutStream
字符流基类
Reader Writer
所有的子类后辍名都为基类,前辍为功能
字符流和字节流区别
字符流主要用于对文字的操作,字节流主要对文件,多媒体等二进字数据的操作
字符流
写入流Writer
Writer writer = new FileWriter("D:\\aa.txt"); 如果文件不存在则创建一个文件
writer.writer("这是输入的数据"); 将字符放入到输出流中
writer.flush(); 将放入缓存的数据刷到目录盘符中
writer.close();关闭输出流,并将缓存的数据刷到目录盘符中;
IO异常的处理方式
throws抛出异常
try(){}cath(){}捕获异常 在finaly中加入流
读取流Reader
Reader reade = new Reader("D:\\aa.txt");如果文件不存在的话会报错
char[] c = new char[1024];
int len= reade.read(c);
while(len!=-1){
System.out.println(new String(c));
}
BufferedWriter
方法对象为Writer提供了一个缓冲区,写入文件的频率降低,将写入信息保存到一个缓存里面,通过flash()直接刷入文件中,提高了效率
Writer writer = new Writer("D:aa.txt");
BufferedWriter bw = new BufferedWriter(writer);
bw.writer("aaaaa");
bw.newLine();增加一个换行符 可跨平台使用
bw.flash();
bw.close(); 因为该缓冲区是为writer对象准备的,所以关闭bw就等于关闭了writer
BufferReader
对象为Reader提供了一个缓冲区,将文件读到一个缓冲区里面,
在缓冲区里可以通过读取一行(不加缓冲区只可以读取一个字符,频繁读取操作速度慢),实现文件较快的读取操作
Reader rd = new Reader("D:aa.txt");
BufferReader br = new BufferReader(rd);
String info=br.readLine();
读取一行的信息,返回值为字符串,如果读取完了,则返回值为null...还有此返回信息只包含有效信息,不包括空格等字符;
原理:本方法实现原理也还是通过read()方法一个字符一个字符读取,并存到缓存中,遇到\r\n换行符的时候,将数据整合成一行从缓存里面刷出来
while((info=br.read())!=-1){
System.out.print(info);
}
装饰模式
主要用于对原方法的功能增强
在构造的时候需要传入原方法的对象,以方便对原方法进行增强
一般都有相同的父类对象或继承自同一个接口,对相应的功能进行扩展
和继承和区别
装饰模式只需要传入一个对象即可,多级装饰的时候不会代码臃肿,代码间关系降到很低,如果当前的扩展不能用,可以只用原来的功能
继承如果多级继承的话,代码会臃肿,不容易阅读,如果父类对象出现变动,子类对象也需要全部进行更改,耦合度过高
LineNumReader
此对象和BufferReader缓存对象混合使用,使用装饰模式,将文件按行读出来,并加上行号
public class Dome4 extends Reader {
private BufferedReader bf;
Dome4(BufferedReader bf) {
this.bf = bf;
}
@Override
public int read() throws IOException {
LineNumberReader lnr = new LineNumberReader(bf);
System.out.println(lnr.getLineNumber()+" "+lnr.readLine());
return super.read();
}
@Override
public void close() throws IOException {
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return 0;
}
public static class Test {
public static void main(String[] args) {
try {
FileReader reader = new FileReader("D:\\aaaaaaaaa.txt");
BufferedReader br = new BufferedReader(reader);
Dome4 d4 = new Dome4(br);
d4.read();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}