Java知识梳理之Stream流操作

本文深入探讨了Java中I/O流的基础概念,包括基类InputStream和OutputStream的作用与使用,文件流FileInputStream和FileOutputStream的实践操作,以及缓冲流BufferedInputStream和BufferedOutputStream提升I/O效率的原理和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 基类:InputStream 和 OutputStream

字节流主要操作byte类型数据,以byte数组为准,java 中每一种字节流的基本功能依赖于基本类 InputStream 和 Outputstream,他们是抽象类,不能直接使用。字节流能处理所有类型的数据(如图片、avi等)。

  • InputStream 是所有表示位输入流的父类,继承它的子类要重新定义其中所定义的抽象方法。InputStream 是从装置来源地读取数据的抽象表示,例如 System 中的标准输入流 in 对象就是一个 InputStream 类型的实例。
  • OutputStream 是所有表示位输出流的类之父类。子类要重新定义其中所定义的抽象方法,OutputStream 是用于将数据写入目的地的抽象表示。例如 System 中的标准输出流对象 out 其类型是java.io.PrintStream,这个类是 OutputStream 的子类。

2. 文件流

在 I/O 处理中,最常见的就是对文件的操作。java.io 包中所提供的文件操作类包括:

  • 用于读写本地文件系统中的文件:FileInputStream 和 FileOutputStream
  • 描述本地文件系统中的文件或目录:File、FileDescriptor 和 FilenameFilter
  • 提供对本地文件系统中文件的随机访问支持:RandomAccessFile
public class FileTest {
    public static void main(String[] args){
        try{
            //input文件必须是存在的,不然会抛出FileNotFoundException
            File inputFile = new File("/Users/xx/Desktop/test.txt");
            //output文件可以存在可以不存在,不存在会自动创建
            File outputFile = new File("/Users/xx/Desktop/test2.txt");
            FileInputStream inputStream = new FileInputStream(inputFile);
            FileOutputStream outputStream = new FileOutputStream(outputFile);
            int c;
            while ((c = inputStream.read()) != -1){
                outputStream.write(c);
            }
            //记得关闭释放系统资源
            inputStream.close();
            outputStream.close();

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

3. 缓冲流

类 BufferedInputStream 和 BufferedOutputStream 实现了带缓冲的过滤流,它提供了缓冲机制,把任意的 I/O 流“捆绑”到缓冲流上,可以提高 I/O 流的读取效率。

在初始化时,除了要指定所连接的 I/O 流之外,还可以指定缓冲区的大小。缺省时是用32字节大小的缓冲区;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等的整数倍。

BufferedInputStream 的数据成员 buf 是一个位数组,默认为2048字节。当读取数据来源时例如文件,BufferedInputStream 会尽量将 buf 填满。当使用 read ()方法时,实际上是先读取 buf 中的数据,而不是直接对数据来源作读取。当 buf 中的数据不足时,BufferedInputStream 才会再实现给定的 InputStream 对象的 read() 方法,从指定的装置中提取数据。

BufferedOutputStream 的数据成员 buf 是一个位数组,默认为512字节。当使用 write() 方法写入数据时,实际上会先将数据写至 buf 中,当 buf 已满时才会实现给定的 OutputStream 对象的 write() 方法,将 buf 数据写至目的地,而不是每次都对目的地作写入的动作。  

对于 BufferedOutputStream,只有缓冲区满时,才会将数据真正送到输出流,但可以使用 flush() 方法人为地将尚未填满的缓冲区中的数据送出

//[ ]里的内容代表选填,缓冲区的大小
BufferedInputStream(InputStream in [, int size])
BufferedOutputStream(OutputStream out [, int size])


//缓冲流如何与文件流一起工作
public class IntegerTest {
    public static void main(String[] args){
        try{
            //input文件必须是存在的,不然会抛出FileNotFoundException
            File inputFile = new File("/Users/xx/Desktop/test.txt");
            //output文件可以存在可以不存在,不存在会自动创建
            File outputFile = new File("/Users/xx/Desktop/test2.txt");

            FileInputStream inputStream = new FileInputStream(inputFile);
            FileOutputStream outputStream = new FileOutputStream(outputFile);
            
            //连接文件流
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream,256);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream,256);

            //设置缓冲区
            byte[] buf = new byte[256];
            int len = bufferedInputStream.read(buf);
            while (len != -1){
                bufferedOutputStream.write(buf,0,len);
                len = bufferedInputStream.read(buf);
            }
            //有可能最后一个缓冲区不到256字节,手动push
            bufferedOutputStream.flush();
            bufferedInputStream.close();
            bufferedOutputStream.close();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值