Java Foundation Building 32-IO Stream 02-Node Stream & Processing Stream

Table of contents

Node Flow and Process Flow

1. Process flow design pattern

2. IO Stream Design Pattern - Decorator Pattern Simulation

3. BufferedReader & BufferedWriter

4. Buffered copy (character file)

5. Buffered byte processing stream

6.Buffered copy (byte file)

7. Object processing flow

8. Standard input and output stream

conversion stream

1) The problem of garbled characters leads to conversion stream

2)InputStreamReader&OutputStreamWriter

Print stream PrintStream&PrintWriter

1)PrintStream

2) PrintWriter

Properties class

1) The configuration file leads to Properties

2) Properties class

the case

1) Directory file operation

2) Read file operation


Node Flow and Process Flow

1. Process flow design pattern

2. IO Stream Design Pattern - Decorator Pattern Simulation

/**
* @author:飞扬
* @公众hao:程序员飞扬
* @description: IO流设计模式-装饰器模式模拟
*/
public abstract class Reader_ {
    
    //抽象类,提供两个空方法
    public void readFile(){}
    
    public void readString(){}
}

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: IO流设计模式-装饰器模式模拟
 */
public class FileReader_ extends Reader_{

    //模拟节点流,读取文件
    @Override
    public void readFile(){
        System.out.println("读取文件。。。");
    }
}
/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: IO流设计模式-装饰器模式模拟
 */
public class StringReader_ extends Reader_{

    //模拟节点流,处理字符串
    @Override
    public void readString(){
        System.out.println("读取字符串。。。");
    }
}
/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: IO流设计模式-装饰器模式模拟
 *
 * 模拟处理流/包装流
 */
public class BufferedReader_ extends Reader_{

    private Reader_ reader_;

    public BufferedReader_(Reader_ reader_) {
        this.reader_ = reader_;
    }

    //原始方法
    public void readFile(){
        reader_.readFile();
    }

    public void readString(){
        reader_.readFile();
    }

    //扩展方法,多次读取文件(也可以加缓冲byte[]等)
    public void readFile(int num){
        for (int i = 0; i < num; i++) {
            reader_.readFile();
        }
    }

    //扩展方法,多次读取字符串(也可以批量读取字符串)
    public void readString(int num){
        for (int i = 0; i < num; i++) {
            reader_.readString();
        }
    }
}
/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 装饰器模式模拟测试
 */
public class Test_ {
    public static void main(String[] args) {
        BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
        bufferedReader_.readFile(); //调原始方法
        System.out.println("----");
        bufferedReader_.readFile(3); //调扩展方法

        BufferedReader_ bufferedReader_1 = new BufferedReader_(new StringReader_());
        bufferedReader_1.readString(); //调原始方法
        System.out.println("----");
        bufferedReader_1.readString(5); //调扩展方法

    }
}

Focus on understanding and understanding the ingenuity of the decorator pattern design idea.

3. BufferedReader & BufferedWriter

Case: Use BufferedReader to read text files

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
        String filePath = "d:\\hello.txt";

        //创建BufferedReader
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));

        //按行读取,效率高
        String line;

        //bufferedReader.readLine()是按行读取文件
        //当返回null时表示读取完毕
        while((line = bufferedReader.readLine()) !=null){
            System.out.println(line);
        }

        //关闭流,这里注意,只需要关闭最外层流,因为底层会自动关闭节点流(追源码)
        bufferedReader.close();
    }
}

BufferedWriter writes files

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class BufferedWriterTest {
    public static void main(String[] args) throws IOException {
        String filePath = "d:\\栓克油.txt";
        //BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath)); //会覆盖
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true)); //追加模式

        bufferedWriter.write("hello,");
        bufferedWriter.newLine();
        bufferedWriter.write("飞扬");

        bufferedWriter.close();
    }
}

4. Buffered copy (character file)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class BufferedCopy {

    public static void main(String[] args) {

        String srcFilePath = "d:\\hello.txt";
        String destFilePath = "d:\\bufferedCopy.txt";

        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;

        try{
            bufferedReader = new BufferedReader(new FileReader(srcFilePath));
            bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));

            String line;
            while((line = bufferedReader.readLine()) != null){
                bufferedWriter.write(line);
                bufferedWriter.newLine();
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if(bufferedWriter != null){
                    bufferedWriter.close();
                }
                if(bufferedWriter != null){
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

5. Buffered byte processing stream

6.Buffered copy (byte file)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 字节流拷贝(拷贝二进制文件,如图片,音视频等)
 *
 * 思考:字节流可以操作二进制文件,可以操作文本文件吗,当然可以。。。
 */
public class BufferedCopy2 {
    public static void main(String[] args) {

        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try{
            FileInputStream fis = new FileInputStream("d:\\aaa.jpg");
            FileOutputStream fos = new FileOutputStream("d:\\aaa2.jpg");
            bufferedInputStream = new BufferedInputStream(fis);
            bufferedOutputStream = new BufferedOutputStream(fos);
            
            byte[] b = new byte[1024];

            int len;
            while((len=bufferedInputStream.read(b)) != -1){
                bufferedOutputStream.write(b,0,len);
            }
            System.out.println("拷贝完成~~");
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if(bufferedOutputStream !=null) {
                    bufferedOutputStream.close();
                }
                if(bufferedInputStream != null){
                    bufferedInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

7. Object processing flow

First recall what is serialization and deserialization

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 序列化演示
 */
public class ObjectOutputStream_ {
    public static void main(String[] args) {
        String path = "d:\\data.dat";

        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
            oos.writeInt(100);  //将整型值100写入流中
            oos.writeBoolean(true);
            oos.writeChar('a');
            oos.writeDouble(9.5);
            oos.writeObject(new Dog("旺财",3));

            oos.close();
            System.out.println("序列化输写文件完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

class Dog implements Serializable {
    private String name;
    private Integer age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class ObjectInputStream_ {
    public static void main(String[] args) {
        String path = "d:\\data.dat";

        try {
            //创建流对象
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
            
            //读取,注意事项
            System.out.println(ois.readInt());
            System.out.println(ois.readBoolean());
            System.out.println(ois.readChar());
            System.out.println(ois.readDouble());
            System.out.println(ois.readObject());
            
            //关闭
            ois.close();

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

Object processing flow considerations:

8. Standard input and output stream

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:标准输入输出流
 */
public class InputAndOutput {
    public static void main(String[] args) {

        //System类的 public final static InputStream in = null;
        //System.in     编译类型    InputStream
        //System.in     运行类型    BufferedInputStream
        //表示的是标准输入  键盘
        System.out.println(System.in.getClass());


        //System类的 public final static PrintStream out = null;
        //System.out    编译类型    PrintStream
        //System.out    运行类型    PrintStream
        //表示的是标准输出  显示器
        System.out.println(System.out.getClass());

        Scanner scanner = new Scanner(System.in);
        System.out.println("输入内容:");
        String next = scanner.next();
        System.out.println("next=" + next);

    }
}

class java.io.BufferedInputStream

class java.io.PrintStream

Type in:

hello shanghai

next=Hello, Shanghai

conversion stream

1) The problem of garbled characters leads to conversion stream

The file content and encoding are as follows:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 乱码问题引出转换流
 */
public class CodeQuestion {
    public static void main(String[] args) throws IOException {
        String filePath = "d:\\hello.txt";
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        String s = bufferedReader.readLine();
        System.out.println("读取到的内容:" + s);
        bufferedReader.close();

    }
}

Run output:

Read content: aaa����

Garbled characters were found.

2)InputStreamReader&OutputStreamWriter

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 字节输入流(转换流)
 */
public class InputStreamReader_ {
    public static void main(String[] args) throws IOException {
        String filePath = "d:\\hello.txt";

        InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk");
        BufferedReader bufferedReader = new BufferedReader(isr);
        String s = bufferedReader.readLine();
        System.out.println("读取内容=" + s);

    }
}

output: read content = aaa flying

No more garbled characters

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 直接输出流(转换流)
 */
public class OutputStreamReader_ {
    public static void main(String[] args) throws IOException {
        String filePath = "d:\\feiyang.txt";
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath),"gbk");
        osw.write("hello,飞扬");

        osw.close();
    }
}

The execution result generates a file with the specified encoding without garbled characters

Print stream PrintStream&PrintWriter

1)PrintStream

import java.io.IOException;
import java.io.PrintStream;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:    打印流
 */
public class PrintStream_ {
    public static void main(String[] args) throws IOException {
        PrintStream out = System.out;
        out.print("hello,tom");

        //也可以直接调用write()打印/输出
        out.write("hello,tom".getBytes());
        out.close();

        //可以去修改打印输出的位置/设备
        System.setOut(new PrintStream("d:\\f1.txt"));
        System.out.println("hello,峰峰,你可长点心吧");
    }
}

Output result:

2) PrintWriter

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 打印流PrintWriter
 */
public class PrintWriter_ {
    public static void main(String[] args) throws IOException {
        PrintWriter printWriter = new PrintWriter(new FileWriter("d:\\abc.txt"));
        printWriter.print("你好,上海");
        printWriter.close(); //注意,必须关闭流才会写入
    }
}

Output result:

Properties class

1) The configuration file leads to Properties

New file:

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class Properties01 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("src\\mysql.properties"));
        String line = "";
        while((line = br.readLine()) != null){
            String[] s = line.split("=");
            System.out.println(s[0]+"的值为"+s[1]);
        }
    }
}

printout:

The value of user is root

The value of password is 123456

The value of url is jdbc:mysql://localhost:3306/testdb

The value of driver is com.mysql.jdbc.Driver

Conclusion: reading and writing is troublesome and inconvenient

2) Properties class

import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:使用Properties类来读取文件
 */
public class Properties02 {
    public static void main(String[] args) throws IOException {
        //创建Properties对象
        Properties properties = new Properties();

        //加载指定配置文件
        properties.load(new FileReader("src\\mysql.properties"));

        //把k-v显示控制台
        properties.list(System.out);    //获取列表集合

        //根据key获取对应的值
        String url = properties.getProperty("url"); //获取指定属性
        System.out.println(url);

    }
}

Printout:
-- listing properties --

user=root

password=123456

url=jdbc:mysql://localhost:3306/testdb

driver=com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/testdb

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:使用Properties类保存配置文件,修改配置文件
 */
public class Properties03_ {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties();
        properties.setProperty("charset","utf-8");
        properties.setProperty("user","汤姆");//此处保存的是unicode编码
        properties.setProperty("pwd","666");

        properties.setProperty("pwd","888"); //修改属性值(没有该属性就新增,有就修改)

        properties.store(new FileOutputStream("src\\mysql03.properties"),null);//保存
        properties.store(new FileOutputStream("src\\mysql03.properties"),"这是一个注释");//保存(指定注释)
        System.out.println( "保存配置文件成功~");
    }
}

Results of the:

the case

1) Directory file operation

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class Homework01 {
    public static void main(String[] args) throws IOException {

        String direPath = "d:\\mytemp";
        File file = new File(direPath);
        if(file.exists()){
            System.out.println("目录已经存在");
        }else{
            boolean mkdir = file.mkdir();
            if(!mkdir){
                System.out.println("创建" + direPath +"目录失败");
            }else{
                System.out.println("创建" + direPath +"目录成功");
            }
        }

        String filePath = direPath + "\\homework01.txt";

        File file1 = new File(filePath);
        if(file1.exists()){
            System.out.println("文件" + filePath + "已存在");
        }else{
            if(file1.createNewFile()){
                System.out.println("创建" + filePath + "成功");

                BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
                bufferedWriter.write("我要学java");
                bufferedWriter.close();
                System.out.println("文件写入成功");
            }else{
                System.out.println(filePath + "创建失败");

            }
        }
    }

}

operation result:

2) Read file operation

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: 读取文件操作
 */
public class Homework02 {
    public static void main(String[] args) {
        String filePath = "D:\\homework02.txt";
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(filePath));

            String line = "";
            int num = 0;
            while ((line = br.readLine()) != null) {
                System.out.println(++num + line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(br !=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

operation result:

3) Properties & Serialization

package com.feiyang.basic15_file;

import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Properties;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: Properties读取文件与序列化
 */
public class Homework03 {
    public static void main(String[] args) throws IOException {
        String filePath = "src\\dog.properties";
        Properties properties = new Properties();
        properties.load(new FileReader(filePath));

        String name = properties.getProperty("name") + "";
        int age = Integer.parseInt(properties.getProperty("age") + "");
        String color = properties.getProperty("color") + "";

        Dog dog = new Dog(name, age, color);
        System.out.println(dog);

        //序列化对象
        String serFilePath = "d:\\dog.dat";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serFilePath));
        oos.writeObject(dog);

        oos.close();
        System.out.println("dog序列化完成");

    }

    //反序列化
    @Test
    public void m1() throws IOException, ClassNotFoundException {
        String serFilePath = "d:\\dog.dat";
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(serFilePath));
        Dog dog = (Dog)objectInputStream.readObject();
        System.out.println(dog);
    }

}

class Dog implements Serializable {
    private String name;
    private int age;
    private String color;

    public Dog() {
    }

    public Dog(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                '}';
    }
}

Guess you like

Origin blog.csdn.net/lu_xin5056/article/details/126834014
Recommended