JAVA IO

954 阅读3分钟

参考文章juejin.cn/post/684490…

IO

java流使用了一种装饰器设计模式,它将 IO 流分成底层节点流和上层处理流,其中节点流用于和物理节点直接关联,程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同物理节点的资源。

为什么要使用IO流?

  • 当我们的程序需要从硬盘,网络,或其他应用程序中读取数据时,数据的传输量可能很大,而我们的内存或带宽有限,无法一次性读取写入大量的数据。
  • 而流stream实现了一点一点逐步的传输数据。
  • 想像我们下载一个大文件,并不会占用你很大的内存空间,而是将内存划分出一个缓冲区,一点一点的写入内存,缓冲区满了在写入硬盘。

stream

在java中把不同的输入源(键盘,文件,网络连接等)抽象的表述为stream 。通过流的形式允许java程序以相同的方式来访问不同的输入输出源。

流的分类

  • 输入流:程序只能从输入流中获取信息。

  • 输出流:程序只能从输出流中写入数据。

输入流主要由 InputStream 和 Reader 作为基类,输出流主要由 OutputStream 和 Writer 作为基类。它们都是抽象基类。

字节流和字符流

  • 字节流 java中的字节流处理的基本单位是单个字节,它通常用来处理二进制数据
  • 字符流 java中的字符流处理的基本单位是Unicode编码,大小是两个字节,他通常用来处理文本数据。
  • 字符流和字节流

  • 区别
    • 字节流在操作是通常是不用缓冲区的(内存),是与文本直接进行操作的,而字符流在操作中的时候是要用到缓冲区的。字节流操作完成后不调用close()函数也能正常输出,而字符流不行。因为缓冲区时会强制把缓冲中的内容输出。当然调用fiash()方法也可以。
    • 字节流能够处理任何类型的对象,而字符流只能处理字符或字符串。字节流提供了处理任何类型IO操作的功能,但是不能直接处理Unicode字符。
    • 如果是音视频文件,图片等一般采用字节流,如果是关系到文本(中文),一般采用字符流。
    • 字节流处理单元为一个字节,字符流为两个字节

Java操作的处理流程

  • 使用file类打开一个文件
  • 使用字节流或字符流的子类
  • 进行读写操作
  • 关闭输入输出

##举例

FileInputStream & FileOutputStream,实现文件拷贝

// 使用文件字节流 一次拷贝一个字节
    private static void copyFile1(String src, String dest) throws IOException {
        //1. 创建流
        InputStream in = new FileInputStream(src);
        OutputStream os = new FileOutputStream(dest);

        //2. 读写数据
        int data = in.read();
        while (data != -1) {
            os.write(data);
            data = in.read();
        }

        //3. 关闭流
        in.close();
        os.close();
    }

    // 使用文件字节流 一次拷贝一个字节数组
    private static void copyFile2(String src, String dest) throws IOException {
        //1. 创建流
        InputStream in = new FileInputStream(src);
        OutputStream os = new FileOutputStream(dest);

        //2. 读写数据
        byte[] buffer = new byte[2048];
        int len = in.read(buffer);
        while (len != -1) {
            os.write(buffer, 0, len);
            len = in.read(buffer);
        }
        //3. 关闭流
        in.close();
        os.close();
   }