项目内容学习(2)| 青训营笔记

69 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

IO流

分类字节Byte输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
访问字符串按字符访问StringReaderStringWriter
以上属于节点流
缓冲流BufferedInputSreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamReader
对象流ObjectInputStreamObjectOutputStream
抽象基类FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
打印流PrintStreamPrintWriter

节点流:从一个特定数据源(如文件、数组)读写数据,比较底层。

包装流:将节点流进一步封装,提供更多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");
    }
}

image.png