IO流:
一.io基础理解:
可以在设备上搬运数据的流对象,相对于内存而言,(可以把io理解为内存公司请的搬运工)硬盘上存储的是二进制,8个2进制为一个字节。
搬进内存的流:inputstream(读)
搬出内存的流:outputstream(写)
每个国家都有自己使用的语言,和使用的字符。每个国家都有他们使用的字符和2进制字节对应关系的编码表,将编码表和字节流封装就形成了字符流。
搬进内存的流:reader(读)
搬出内存的流:writer(写)
上面的读写都是一个一个读写,效率低,所有引入了缓冲流。
BufferedInputstream
BufferedOutputstream
Buffered Reader
Buffered Writer
字符流=字节流+编码表
转化流:字节转字符: inputstreamReader(new inputstream(基本数据源),编码表)
字符转字节 outputstreamWriter(new outputstream(基本数据源),编码表)
(注意:流创建后需要关闭(流对象.close))
二.下面详细数码io流:
1. 拷贝文件:
(a) //将硬盘中的一个文件进行复制。
/*思路:首先你有输入流,获取文件,在有输出流,将复制的文件进行存储。
* 这里面为了高效,定义一个缓冲区。*/
FileReader fr = new FileReader("c:\\demo.txt");
FileWriter fw = new FileWriter("c:\\copy_demo.txt");
char[] buf = new char[1024];
int len = 0;
while((len = fr.read(buf))!=-1){//将demo文件读到cha数组中去。
//进行写的操作
fw.write(buf, 0, len);
}
fr.close();
fw.close();}}
(解析代码:源文件需要用输入流关联,目的地用输出流关联。 引入缓冲流可以提高效率,读的方法 对象.read(char[])写的方法 对象.writer(char[] ,start,end). 重点注意读写方式。
(b)加入缓冲流的coyp
FileReader fr = new FileReader("c:\\ demo.txt");
BufferedReader br = new BufferedReader(fr);
// BufferedReader br = new BufferedReader(new FileReader("buf.txt"));
//定义一个写入硬盘流 并装饰。
FileWriter fw = new FileWriter("c:\\ copy_demo.txt");
BufferedWriter bw = new BufferedWriter(fw);
// BufferedWriter bw = new BufferedWriter(new FileWriter("copy_buf.txt"));
//然后进行读写操作。 因为定义的是默认的缓冲区,所以调用缓冲区的读取方法 ,就是一行读取
String line = null;
while((line = br.readLine())!=null){
bw.write(line);
bw.newLine();
}
br.close();
bw.close();
}
}
(代码解析:缓冲流只是装饰,注意怎么装饰的。由于readLine()方法是读取一行,注意变量line的类型。Newline可以换行。)
(c)复制MP3:
BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("a.mp3"));
BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("coyp_a. mp3"));
int len=0
while((len=bufis.read())!=-1){
bufos.write(len);
}
2装饰设计模式
理解:当想要对已有的独享进行功能增强时,可以定义类,将已有的对象传入,基于已经有的功能,并提供加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
Io流中装饰模式应用非常广泛,出字节输入输出流,字符,输入输出和装换流外大多是装饰。
自定义BufferedReader 的装饰类MyBufferedReader :
package com.io;
import java.io.*;
public class MyBufferedReader {
private Reader r;
public MyBufferedReader(Reader r) {
super();
this.r = r;
}
//可以一次读取一行的方法
public String myReadLine() throws IOException
{
//定义一个临时容器。StringBulider容器,应用于存储字符数组
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
//复写reader中的抽象方法
//复写close方法
public void close() throws IOException
{
r.close();
}
//复写read方法
public int read (char[] c,int off,int len) throws IOException{
return r.read(c, off, len);
}
}
总结:io最根本的是对数据进行操作,必须掌握它的读写。理解他的装饰模式和设计思想。