Java基础学习生疏知识点总结(15)——IO字节流

1、IO概述

1.1 什么是IO?

  • i:input输入
  • o: output 输出

1.2 为什么会有IO?

  • 需要长久保存的数据都是以文件的形式存储的,存储在外边设备当中
  • 内存有限,需要把数据读取到内存才行,需要io交互

1.3 java中如何实现IO功能?

  • 通过流
  • java流模型
    在这里插入图片描述

1.4 流的分类

  • 按照流向分(前提条件,以内存为参照)
    ①输入流 input
    ②输出流output
  • 按照数据类型分类
    ①字节流 : 一连串的01二进制数据 按字节传输 1B=8bit 0000 0000
    ②字符流: 一连串的字符序列,把它当做一种文化符号 , “你” “abc” ,“の”

1.5 抽象基类

  • 字节输出流 OutputStream
  • 字节输入流: InputStream
  • 字符输出流:Writer
  • 字符输入流:Reader
    注意:
    由这4个基类派生出的子类,其子类名都是以父类名作为后缀的
    FileOutputStream 文件字节输出流
    FileInputStream 文件字节输入流

1.6 什么时候该用什么流

  • 不知道用啥的时候就用字节流 字节流是万能的
  • 对于文本文件 我们选择用字符流

2、字节流

2.1 字节输出流

在这里插入图片描述
在这里插入图片描述

2.2 字节输出流具体子类

2.2.1FileOutputStream

在这里插入图片描述
例子:

package com.cskaoyan.bytestream.out;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @description: 构造方法
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo1 {
    public static void main(String[] args) throws IOException {
        // 方式一
        File file = new File("a.txt");
        FileOutputStream out = new FileOutputStream(file);
        // 方式二
        FileOutputStream fileOutputStream = new FileOutputStream("a.txt");

        FileOutputStream outputStream = new FileOutputStream(new File("a.txt"));
    }
}

在这里插入图片描述
3个write方法:

package com.cskaoyan.bytestream.out;

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

/**
 * @description: write方法
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo2 {
    public static void main(String[] args) throws IOException {
        // 创建文件字节输出流对象
        FileOutputStream out = new FileOutputStream("../day16_io01/a.txt");
        // 第一种write方法 write(int b)
        // writeSingle(out);


        // 第二种write方法 write(byte[] b)
        String s = "abc";
        //writeMuti(out, s);

        // 第三种write方法 write(byte[] b ,int off,int len)
        byte[] bytes = s.getBytes();
        out.write(bytes,0,bytes.length);
        // 写数据
        
        // 关闭资源 close
        out.close();
    }

    private static void writeMuti(FileOutputStream out, String s) throws IOException {
        byte[] bytes = s.getBytes();
        out.write(bytes);
    }

    private static void writeSingle(FileOutputStream out) throws IOException {
        out.write(97);
        out.write(98);
    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.out;

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

/**
 * @description: 文件追加写入
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo3 {
    public static void main(String[] args) throws IOException {
        FileOutputStream outputStream =
                new FileOutputStream("../day16_io01/a.txt",true);
        outputStream.write("def".getBytes());
        outputStream.close();
    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.out;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @description: 换行
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo4 {
    public static void main(String[] args) throws IOException {
        FileOutputStream outputStream =
                new FileOutputStream("../day16_io01/a.txt",true);
        //outputStream.write("\n".getBytes());
        //outputStream.write(System.lineSeparator().getBytes());
        outputStream.write("\r".getBytes());
        outputStream.write("def".getBytes());
        outputStream.close();    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.out;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @description: 异常处理方式一
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo5 {
    public static void main(String[] args) {
        FileOutputStream out = null;
        try {

            out = new FileOutputStream("../day16_io01/a.txt");
            out.write(97);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.out;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @description: 异常处理方式二
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo6 {
    public static void main(String[] args) {
        try(FileOutputStream out = new FileOutputStream("../day16_io01/a.txt")) {
            // 写数据
            out.write("abc".getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

例子:

package com.cskaoyan.bytestream.out;

/**
 * @description: AutoCloseable例子
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo7 {
    public static void main(String[] args) {
        try(A a = new A()) {
            a.test();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class A implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println("close 方法执行了!!");
    }

    public void test(){
        System.out.println("test 执行了!!");
    }

}

2.2.2 BufferedOutputStream

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.cskaoyan.bytestream.buff;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @description:
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo {
    public static void main(String[] args) throws IOException {
        //FileOutputStream out = new FileOutputStream("a.txt");
        //BufferedOutputStream bo = new BufferedOutputStream(out);
        BufferedOutputStream bufferedOutputStream =
                new BufferedOutputStream(new FileOutputStream(new File("a.txt")));

        bufferedOutputStream.write(97);
        //bufferedOutputStream.flush();
        // 对于包装流 我们只需关闭最外层的流
        // close方法会执行flush方法
        bufferedOutputStream.close();
    }
}

注意:
close方法会执行flush方法
对于包装流 我们只需关闭最外层的流

2.2.3 装饰设计模式

不改变原有类的基础上去扩展新的功能
在这里插入图片描述

package com.cskaoyan.bytestream.decorator;

/**
 * @description: 装饰设计模式例子
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo {
    public static void main(String[] args) {
        MilkTea milkTea = new MilkTea();
        milkTea.add();
        System.out.println("-------------");
        DecoratorA decoratorA = new DecoratorA();
        decoratorA.setBeverage(milkTea);
        decoratorA.add();
        System.out.println("---------------");
        DecoratorB decoratorB = new DecoratorB();
        decoratorB.setBeverage(decoratorA);
        decoratorB.add();
        System.out.println("---------------");
        DecoratorC decoratorC = new DecoratorC();
        decoratorC.setBeverage(decoratorB);
        decoratorC.add();
    }
}

/*表示饮料 基类*/
abstract class Beverage {
    // 添加小料
    abstract void add();
}
/*奶茶类*/
class MilkTea extends Beverage {

    @Override
    void add() {
        System.out.println("老板,来杯奶茶,加冰! ");
    }
}
/*装饰器类*/
class Decorator extends Beverage {
    public Beverage beverage;

    public void setBeverage(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    void add() {
        beverage.add();
    }
}
/*加珍珠*/
class DecoratorA extends Decorator {
    @Override
    void add() {
        super.add();
        addZz();
    }

    private void addZz() {
        System.out.println("再加点珍珠!");
    }
}
/*加椰果*/
class DecoratorB extends Decorator {
    @Override
    void add() {
        super.add();
        addYg();
    }

    private void addYg() {
        System.out.println("再加点椰果!");
    }
}

class DecoratorC extends Decorator {
    @Override
    void add() {
        super.add();
        addHd();
    }

    private void addHd() {
        System.out.println("再加点红豆");
    }
}

2.3 字节输入流

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4 字节输入流具体子类

2.4.1 FileInputStream

在这里插入图片描述
例子:

public class Demo1 {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流对象
        FileInputStream fileInputStream = new FileInputStream(new File("a.txt"));

        FileInputStream fileInputStream1 = new FileInputStream("a.txt");
    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.in;

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

/**
 * @description:
 * @author: songtao@cskaoyan.onaliyun.com
 **/
// workspace
public class Demo2 {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流对象
        FileInputStream in = new FileInputStream("../day16_io01/a.txt");

        // 读取数据
        //readSingle(in);
        //readMuti(in);
        byte[] bytes = new byte[1024];
        int readCount = in.read(bytes, 0, bytes.length);
        System.out.println(new String(bytes,0,readCount));

        // close
        in.close();
    }

    private static void readMuti(FileInputStream in) throws IOException {
        byte[] bytes = new byte[1024];
        int readCount = in.read(bytes);
        // 字节数组转化成字符串
        String s = new String(bytes, 0, readCount);
        System.out.println(s);
    }

    private static void readSingle(FileInputStream in) throws IOException {
        // read() 返回的是读取到的一个字节值
        int readData = in.read();
        System.out.println(((char) readData));

        int readData2 = in.read();
        System.out.println(((char) readData2));

        int readData3 = in.read();
        System.out.println(((char) readData3));

        int readData4 = in.read();
        System.out.println(((char) readData4));

        int readData5 = in.read();
        System.out.println((readData5));
    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.in;

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

/**
 * @description:
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("../day16_io01/a.txt");
        byte[] bytes = new byte[4];
        int readCount = in.read(bytes);
        System.out.println(readCount);
        System.out.println(new String(bytes));
        int readCount2 = in.read(bytes);
        System.out.println(readCount2);
        System.out.println(new String(bytes,0,readCount2));

    }
}

循环读

package com.cskaoyan.bytestream.in;

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

/**
 * @description: 循环读
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo4 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("../day16_io01/a.txt");
        // 第一种方式
        //readWhile(in);
        // 单字节
        //readWhile2(in);

        // 字节数组的方式
        int readCount;
        byte[] bytes = new byte[1024];
        while ((readCount = in.read(bytes)) != -1) {
            System.out.println(new String(bytes,0,readCount));
        }

        // 关闭资源
        in.close();
    }

    private static void readWhile2(FileInputStream in) throws IOException {
        int readData;
        while ((readData=in.read()) != -1) {
            System.out.println(readData);
        }
    }

    private static void readWhile(FileInputStream in) throws IOException {
        while (true) {
            int readData = in.read();
            System.out.println(readData);
            if (readData == -1) {
                break;
            }
        }
    }
}

2.4.2 BufferedInputStream

在这里插入图片描述
在这里插入图片描述

package com.cskaoyan.bytestream.buff;

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

/**
 * @description:
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo2 {
    public static void main(String[] args) throws IOException {
        BufferedInputStream br =
                new BufferedInputStream(new FileInputStream("a.txt"));
        // 读数据
        int readData = br.read();
        System.out.println(((char) readData));
        // close
        br.close();
    }
}

2.5 复制文件练习

在这里插入图片描述

package com.cskaoyan.bytestream.ex;

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

/**
 * @description: 复制文本文件
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo1 {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流对象
        FileInputStream in = new FileInputStream("aa.txt");
        // 创建字节输出流对象
        FileOutputStream out = new FileOutputStream("bb.txt");
        // 边读边写
        // 按照单字节的方式去复制文件 耗时:18ms
        //copy1(in, out);
        // 字节数组的方式
        copy2(in, out);
        // close
        in.close();
        out.close();
    }

    private static void copy2(FileInputStream in, FileOutputStream out) throws IOException {
        int readCount;
        byte[] bytes = new byte[1024];
        long start = System.currentTimeMillis();

        while ((readCount = in.read(bytes)) != -1) {
            out.write(bytes,0,readCount);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }

    private static void copy1(FileInputStream in, FileOutputStream out) throws IOException {
        long start = System.currentTimeMillis();
        int readData;
        while ((readData = in.read()) != -1) {
            out.write(readData);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.ex;

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

/**
 * @description: 复制文本文件
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo1 {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流对象
        FileInputStream in = new FileInputStream("D:\\mm.jpg");
        // 创建字节输出流对象
        FileOutputStream out = new FileOutputStream("mm.jpg");
        // 边读边写
        // 按照单字节的方式去复制文件 耗时:110ms
        copy1(in, out);
        // 字节数组的方式 耗时:1ms
        //copy2(in, out);
        // close
        in.close();
        out.close();
    }

    private static void copy2(FileInputStream in, FileOutputStream out) throws IOException {
        int readCount;
        byte[] bytes = new byte[1024];
        long start = System.currentTimeMillis();

        while ((readCount = in.read(bytes)) != -1) {
            out.write(bytes,0,readCount);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }

    private static void copy1(FileInputStream in, FileOutputStream out) throws IOException {
        long start = System.currentTimeMillis();
        int readData;
        while ((readData = in.read()) != -1) {
            out.write(readData);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }
}

在这里插入图片描述

package com.cskaoyan.bytestream.ex;

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

/**
 * @description: 复制文本文件
 * @author: songtao@cskaoyan.onaliyun.com
 **/

public class Demo1 {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流对象
        FileInputStream in = new FileInputStream("D:\\aa.mp4");
        // 创建字节输出流对象
        FileOutputStream out = new FileOutputStream("aa.mp4");
        // 边读边写
        // 按照单字节的方式去复制文件 耗时:8758ms
        //copy1(in, out);
        // 字节数组的方式 耗时:19ms
        copy2(in, out);
        // close
        in.close();
        out.close();
    }

    private static void copy2(FileInputStream in, FileOutputStream out) throws IOException {
        int readCount;
        byte[] bytes = new byte[1024];
        long start = System.currentTimeMillis();

        while ((readCount = in.read(bytes)) != -1) {
            out.write(bytes,0,readCount);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }

    private static void copy1(FileInputStream in, FileOutputStream out) throws IOException {
        long start = System.currentTimeMillis();
        int readData;
        while ((readData = in.read()) != -1) {
            out.write(readData);
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }
}

得出结论

字节数组的方式效率更高
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值