java-IO-高级流

 高级流

      高级流(或者称为包装流)是基于原始字节流和字符流之上的一层流式处理机制。它们提供了更高级别的功能,使得流的使用更加方便和灵活。

     高级流的主要作用有以下几点:

  1. 提供更方便的操作:高级流提供了一些方便的方法和功能,使得对流的操作更加直观和简单。例如,BufferedInputStream和BufferedOutputStream可以提供缓冲区功能,可以一次读取或写入多个字节,减少了与底层IO设备的交互次数,提高了性能。

  2. 提供额外的功能:高级流可以在原始流的基础上提供额外的功能。例如,DataInputStream和DataOutputStream可以读写Java基本数据类型,如int,double等,而不需要手动将其转换成字节。

  3. 增强流的性能:高级流可以通过缓冲区、更高效的算法和处理机制等方式来提高流的性能。例如,GZIPOutputStream和GZIPInputStream可以对数据进行压缩和解压缩,从而减小数据的体积,提高传输效率。

  4. 实现数据转换:高级流可以用来实现数据的转换。例如,InputStreamReader可以将字节流转换为字符流,方便处理文本数据。而OutputStreamWriter则可以将字符流转换为字节流,方便进行网络传输。  

      流连接示意图

         java-IO-高级流_第1张图片

缓冲流

     java.io.BufferedOutputStream和BufferedInputStream.

     缓冲流是一对高级流,作用是提高读写数据的效率.

     缓冲流内部有一个字节数组,默认长度是8K.缓冲流读写数据时一定是将数据的读写方式转换为块读写来保证读写效率.

    使用缓冲流完成文件复制操作

java-IO-高级流_第2张图片


package io;

import java.io.*;

/**
 * java将流分为节点流与处理流两类
 * 节点流:也称为低级流,是真实连接程序与另一端的"管道",负责实际读写数据的流。
 *       读写一定是建立在节点流的基础上进行的。
 *       节点流好比家里的"自来水管"。连接我们的家庭与自来水厂,负责搬运水。
 * 处理流:也称为高级流,不能独立存在,必须连接在其他流上,目的是当数据经过当前流时
 *       对其进行某种加工处理,简化我们对数据的同等操作。
 *       高级流好比家里常见的对水做加工的设备,比如"净水器","热水器"。
 *       有了它们我们就不必再自己对水进行加工了。
 * 实际开发中我们经常会串联一组高级流最终连接到低级流上,在读写操作时以流水线式的加工
 * 完成复杂IO操作。这个过程也称为"流的连接"。
 *
 * 缓冲流,是一对高级流,作用是加快读写效率。
 * java.io.BufferedInputStream和java.io.BufferedOutputStream
 *
 */
public class CopyDemo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("ppt.pptx");
        BufferedInputStream bis = new BufferedInputStream(fis);
        FileOutputStream fos = new FileOutputStream("ppt_cp.pptx");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int d;
        long start = System.currentTimeMillis();
        while((d = bis.read())!=-1){//使用缓冲流读取字节
            bos.write(d);//使用缓冲流写出字节
        }
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start)+"ms");
        bis.close();//关闭流时只需要关闭高级流即可,它会自动关闭它连接的流
        bos.close();
    }
}

缓冲输出流写出数据时的缓冲区问题

    通过缓冲流写出的数据会被临时存入缓冲流内部的字节数组,直到数组存满数据才会真实写出一次


package io;

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

/**
 * 缓冲输出流写出数据的时效性问题(缓冲区问题)
 */
public class BOSDemo {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("bos.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        String line = "画画的baby,画画的baby,奔驰的小野马和带刺的玫瑰~";
        byte[] data = line.getBytes("UTF-8");
        bos.write(data);
        /*
            void flush()
            将缓冲流的缓冲区中已缓存的数据一次性写出。
            注:频繁调用该方法会提高写出的次数降低写出效率。但是可以换来写出
               数据的即时性。
         */
        bos.flush();
        System.out.println("写出完毕!");
        /*
            缓冲流的close操纵中会自动调用一次flush,确保所有缓存的数据会被写出
         */
        bos.close();

    }
}

总结

    高级流也被称为缓冲流,它们是用来提高I/O操作性能的工具。缓冲流内部包含了一个缓冲区,通过在内存中建立一个临时存储区域来减少对物理资源(如磁盘)的访问次数。

   Java中的高级流包括BufferedReader、BufferedWriter、BufferedInputStream和BufferedOutputStream。

  1. BufferedReader:用于读取文本文件。它继承自Reader类,可以一次读取一行文本数据,而不是一个字符或字节。通过缓冲区的机制,减少了寻址磁盘的次数,从而提高了读取效率。

  2. BufferedWriter:用于写入文本文件。它继承自Writer类,可以一次写入一行文本数据,而不是一个字符或字节。通过缓冲区的机制,减少了写入磁盘的次数,从而提高了写入效率。

  3. BufferedInputStream:用于读取二进制文件。它继承自InputStream类,可以一次读取多个字节数据,减少了对物理资源的访问次数,提高了读取效率。

  4. BufferedOutputStream:用于写入二进制文件。它继承自OutputStream类,可以一次写入多个字节数据,减少了对物理资源的访问次数,提高了写入效率。

      这些高级流的使用方法与对应的基本流(如FileReader、FileWriter、FileInputStream和FileOutputStream)类似,区别在于它们会在内部维护一个缓冲区,并提供了一些额外的方法来操作缓冲区。

     使用高级流的优点是可以提高I/O操作的效率,特别是对于大文件或大量数据的读写操作。缓冲区的大小可以根据需求进行调整,默认大小是8192字节。缓冲流还提供了flush()方法,用于强制将缓冲区中的数据写入到物理资源中。

    需要注意的是,在使用高级流时,需要及时关闭流对象,以释放资源。可以使用try-with-resources语句来自动关闭流对象,或者在finally块中手动关闭流对象。

      

你可能感兴趣的:(java,开发语言)