这是我参与「第四届青训营 」笔记创作活动的第3天
IO流
| 分类 | 字节Byte输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
|---|---|---|---|---|
| 抽象基类 | InputStream | OutputStream | Reader | Writer |
| 访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
| 访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
| 访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
| 访问字符串 | 按字符访问 | StringReader | StringWriter | |
| 以上 | 属于 | 节点流 | ||
| 缓冲流 | BufferedInputSream | BufferedOutputStream | BufferedReader | BufferedWriter |
| 转换流 | InputStreamReader | OutputStreamReader | ||
| 对象流 | ObjectInputStream | ObjectOutputStream | ||
| 抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
| 打印流 | PrintStream | PrintWriter | ||
节点流:从一个特定数据源(如文件、数组)读写数据,比较底层。
包装流:将节点流进一步封装,提供更多API使用方便。例如BufferedReader类中有属性Reader,即封装了一个节点流(可以是任意Reader子类),并提供可以操作该节点流的方法,从字符输入流读取文本,缓冲字符,以提供字符、数组和行的高效读取。按字符操作尽量应用在文本文件上,如果用于操作二进制文件如图片声音视频,有可能出现文件内容损失。二进制文件用字节流处理。
使用:new BufferedReader(new FileReader(filePath))封装后使用。
eg:
任务:将c盘下的concert.jpg拷贝到d盘. 通过创建文件输入流(c->java程序)、创建文件输出流(java程序->d盘), 通过字节数组读取方式增加读取效率, 且是读一部分就写一部分, 最后关闭输入输出流释放资源
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
String srcFilePath = "c:\concert.jpg";
String dstFilePath = "d:\concert.jpg";
fileInputStream = new FileInputStream(srcFilePath);
fileOutputStream = new FileOutputStream(dstFilePath, true);
byte[] buffer = new byte[1024];
int readLen = 0;
while ((readLen = fileInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, readLen);
}
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
}
体现出来的设计模式——修饰器模式
为一个类或对象新增属性/方法的两种方式:1、继承机制:静态的,需要新写一个现有类的子类,对类的层次结构进行扩展;2、关联机制:把一个类的对象嵌入到另一个类的对象中,动态的,即拿到一个对象就可以对其进行扩展而不需要修改原有类的逻辑。
Decorators provide a flexible alternative to subclassing for extending functionality.
eg:
public class DecoratorPattern {
public static void main(String[] args) {
version_2 newOne = new version_2(new version_1());
newOne.doMoreThing();
}
}
// method_1接口定义了第一代产品需要实现的全部接口
interface method_1 {
void dosomething();
}
class version_1 implements method_1 {
@Override
public void dosomething() {
System.out.println("第一代产品功能1");
System.out.println("第一代产品功能2");
}
}
// version_2通过构造方法中传入version_1来对原有类进行扩展而不用修改原有类
class version_2 implements method_1 {
private version_1 old;
public version_2(version_1 old) {
this.old = old;
}
@Override
public void dosomething() {
old.dosomething();
}
public void doMoreThing() {
old.dosomething();
System.out.println("第二代产品新增功能3");
}
}