//自定义BufferedReader
public class MyBufferedReader {
private FileReader fr;
private char ch[] = new char[10]; //缓冲区
private int pos = -1; //缓冲区中指针的位置
private int count = 0; //缓冲区中元素个数
//构造方法
public MyBufferedReader(FileReader fr) {
this.fr = fr;
}
//自定义read方法
//br中的read方法读取数据时从缓冲区中读取
public int myRead() throws IOException {
//缓冲区中元素个数为0
if (this.count == 0) {
pos = -1; //角标赋值为-1
//从数据源中读取数据存入缓冲区
int len = fr.read(this.ch);
if (len == -1)
return -1;
this.count = len;
//从缓冲区中读取一个字符
--this.count; //缓冲区中的字符减少一个
return (int) ch[++pos];
} else {
//缓冲区有数据
--this.count;
return (int) ch[++pos];
}
}
//读取一行文本
public String myReadLine() throws IOException {
StringBuffer sb = new StringBuffer();
int len = 0;
while ((len = this.myRead()) != -1) {
char c = (char) len;
if (c == '/r')
continue; //遇到'/r'继续读取
if (c == '/n')
//直接就return,
// 因为如果跳出了循环,那么就没法分清是读取到了流末尾出的循环,
// 还是用break跳出的循环
return sb.toString();
sb.append(c);
}
return null; //返回null表示上面的循环结束,即为读到了流末尾
}
public void close() throws IOException {
fr.close();
}
}
复制代码
装帧设计模式
介绍:装帧设计模式是为了使类的功能更加强大。
实现原理: -请看如下代码:
public class Person {
public void eat() {
System.out.println("恰饭!!!");
}
}
public class NewPerson {
private Person p;
public NewPerson(Person p) {
this.p = p;
}
public void eat() {
System.out.println("饭前喝汤");
p.eat();
System.out.println("饭后甜点");
}
}
复制代码
装帧设计模式与继承的区别:
装饰类比继承更加精炼
三、字符流
FileInputStream
构造方法:
new FileInputStream(String path)
new FileInputStream(File file)
实用方法:
int read():读取一个字节的数据。若返回-1表示读取到了流的末尾。
int read(byte b[]):读取数组b的长度的字节数据进入b数组中,返回读取到的字节数,返回-1表示读到了流的末尾。详细的读取数据到数组b中的过程同上,此处不再赘述。
int read(byte b[],int off,int len)
int available():返回文件中可以读取的数据的估计值(返回字节大小);本方法可以在创建字节数组时定义数组的大小,不过,当文件很大的时候,不能用此方法。
FileOutputStream
构造方法:
new FileOutputStream(String path)
new FileOutputStream(File file)
new FileOutputStream(String path,boolean flag)
new FileOutputStream(File file,boolean flag)
实用方法
void write(byte b[])
void write(byte b[],int off,int len)
void write(int b):写入一个字符(char),只不过是以int来表示。
BufferedInputStream
构造方法:
new BufferedInputStream(InputStream fis)
new BufferedInputStream(InputStream fis, int size)
实用方法:
int read()
int read(byte []b)
int read(byte []b,int off,int len)
close()
BufferedOutputStream
构造方法:
new BufferedOutputStream(OutputStream fos)
new BufferedOutputStream(OutputStream fos,int size)
实用方法:
void write(byte []b)
void write(byte []b,int off,int len)
void write(int ch)
四、转换流
解释
看不懂:磁盘中的存储的数据都是“看不懂”的,也就是以字节形式存储的。
看得懂:内存中存储的数据都是“看得懂”的,也就是以字符形式存储的。
InputStreamReader
new InputStreamReader(InputStream in):
new InputStreamReader(InputStream in,String charsetName):需要传入一个InputStream对象,采用当前平台(操作系统)的解码方式来解码。
OutputStreamWriter:使用指定的解码方式来解码。
把“看得懂”的数据转换成"看不懂"的数据,即把字符流编码成字节流。
new OutputStreamWriter(OutputStream out):需要传入一个OutputStream对象,使用当前平台(操作系统)的编码方式来编码。
new OutputStreamWriter(OutputStream out,String charsetName):使用指定的编码方式来编码。