昨天知识总结
- 1.流的基础
- 2.流的分类
- 3.字符流
- 读 FileReader
- 写 FileWriter
- 4.File
流
字符缓冲流
- 字符缓冲流:又叫字符缓冲区,为了提高读写的能力,本身没有读写的能力,要想进行读写,必须依靠字符流来实现。
- 可以将缓冲流比作催化剂或者高速的小车
- 字符缓冲流分类:
- 1.字符缓冲读入流:BufferedWriter 辅助读,没有读的能力
public static void main(String[] args) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("test.txt"));
bufferedWriter.write("bingbing");
bufferedWriter.newLine();
bufferedWriter.write("bingbing2");
bufferedWriter.close();
}
-
- 2.字符缓冲写出流:BufferedReader 辅助写,没有写的能力
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
String data = null;
while((data = reader.readLine())!=null) {
System.out.print(data);
System.out.println();
}
reader.close();
}
LineNumberReader
- LineNumberReader:是BufferedReader的子类,不能读,但是可以提高效率,,其他功能:设置行号,获取行号
public static void main(String[] args) throws IOException {
LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("src\\com\\qianfeng\\test\\Demo2.java"));
lineNumberReader.setLineNumber(0);
String data = null;
while((data = lineNumberReader.readLine())!= null) {
System.out.print(lineNumberReader.getLineNumber());
System.out.print(data);
System.out.println();
}
lineNumberReader.close();
}
字节流
- 字符流:传输的是字节,只能用于字符的传输
- 字符读入流:Reader
- 字符写出流:Writer
- writer(int c) writer(char() arr) writer(String s)
- 缓冲字符读入流BufferedReader
- 缓冲字符写出流BufferedWriter
- 字节流:传输的是字节,可以传输所有内容
- 字节输入流InputStream
- 字节输出流OutputStream
- 缓冲字节输入流:BufferedInputStream
- 缓冲字节输出流:BufferedOutputStream
public static void writerFile() throws IOException {
OutputStream outputStream = new FileOutputStream("temp2.txt");
outputStream.write("bingbing".getBytes());
outputStream.close();
}
public static void readerFile1() throws IOException {
InputStream inputStream = new FileInputStream("temp2.txt");
int num;
while((num = inputStream.read())!=-1) {
System.out.println((char)num);
}
inputStream.close();
}
public static void readFile2() throws IOException {
InputStream inputStream = new FileInputStream("temp2.txt");
int num;
byte[] arr = new byte[4];
while((num = inputStream.read())!=-1) {
System.out.println(new String(arr,0,num));
}
inputStream.close();
}
public static void readFile3() throws IOException {
InputStream inputStream = new FileInputStream("temp2.txt");
int nums = inputStream.available();
byte[] arr = new byte[nums];
int num = inputStream.read(arr);
System.out.println(new String(arr,0,num));
inputStream.close();
}
标准输入流
- 标准输入流:System.in.:此流已经被打开,这个流默认对应键盘(输入源)或由主机或由用户提供的输入源
public static void main(String[] args) throws IOException {
InputStream inputStream = System.in;
myReadLine(inputStream);
}
public static void myReadLine(InputStream inputStream) throws IOException {
StringBuffer buffer = new StringBuffer();
while(true) {
int num = inputStream.read();
if(num == '\r') {
continue;
}else if(num == '\n') {
System.out.println(buffer.toString());
if(buffer.toString().equals("over")) {
break;
}
buffer.delete(0, buffer.length());
}else {
buffer.append((char)num);
}
}
}
装饰设计模式
- 装饰设计模式:基于已经实现的功能,提供增强的功能
- 装饰设计模式的由来就来自于对缓冲流的实现
- 特点:从缓冲流的角度讲解
- 1.使流原来的继承体更加的简单
- 2.提高了效率
- 3.由于是在原有的基础上提高了增强的功能,所以他还要属于原来的体系
- 演示:如果自己设计装饰设计模式,怎么处理?
- 步骤:
- 1.让BTest继承自Test
- 2.在BTest内有一个Test类型的成员变量
- 3.通过BTest内一个带参数的构造方法接收外部传入的一个Test类型的对象,交给内部的Test的属性
- 4.实现功能的时候,调用传入的Test类型的对象实现原有的功能,自己实现增强的功能
- 实现BufferedReader的重写
- 分析:
- 1.要属于流的体系
- 2.要有一个Reader类型的成员变量
- 3.要有一个带参数的方法接受外部的流对象
- 4.模拟readLine()方法,实现度一行的功能
- 5.重写close()方法
class MyBufferReader extends Reader{
Reader reader;
public MyBufferReader(Reader reader) {
this.reader = reader;
}
public String readLine() throws IOException {
StringBuffer str = new StringBuffer();
int data;
while((data = reader.read())!=-1) {
if(data=='\n') {
return str.toString();
}else if(data == '\r') {
continue;
}else {
str.append((char)data);
}
}
if(str.length()==0) {
return null;
}
return str.toString();
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return 0;
}
@Override
public void close() throws IOException {
this.reader.close();
}
}
适配器设计模式
- 适配器设计模式:通常可以变相的理解成装饰设计模式
- 实例:要求在子类中只是用play方法
- 分析:Dog是继承了ZiMidel类,ZiMidel类是想了Inter接口
- 当Dog类想要实现Inter接口的一个方法的时候,如果直接实现Inter接口,就必须将所有的方法都实现。
- 如果在Dog类与Inter接口之间插入一个可,让这个类去实现Inter接口的所有方法,作为这个类的子类只需要实现自己需要的方法
- 我们将中间的这个类成为适配器类
interface Inter{
public void play();
public void song();
public void run();
public void eat();
public void jump();
}
class ZiMidel implements Inter{
@Override
public void play() {
}
@Override
public void song() {
}
@Override
public void run() {
}
@Override
public void eat() {
}
@Override
public void jump() {
}
}
class Dog extends ZiMidel{
public void play() {
}
}
class Cat extends ZiMidel{
public void song() {
}
}