java Stream类和InputStream/OutputStream类的比较

java.io.InputStream 和 java.io.OutputStream 是 Java I/O 系统中的两个重要抽象类,它们分别代表字节输入流和字节输出流。而 java.util.stream.Stream 是 Java 8 引入的用于支持函数式编程的一个类,用于处理数据序列。虽然它们名字相似,但功能和用途完全不同。

InputStream 和 OutputStream

  • InputStream:是字节输入流的抽象类,定义了从各种输入源(如文件、网络、内存等)读取字节的基本方法。
  • OutputStream:是字节输出流的抽象类,定义了向各种输出目标(如文件、网络、内存等)写入字节的基本方法。

继承关系图:

复制代码
java.lang.Object
  └─ java.io.InputStream
       ├─ java.io.ByteArrayInputStream
       ├─ java.io.FileInputStream
       ├─ java.io.FilterInputStream
       │    ├─ java.io.BufferedInputStream
       │    ├─ java.io.DataInputStream
       │    ├─ java.io.PushbackInputStream
       └─ java.net.SocketInputStream

java.lang.Object
  └─ java.io.OutputStream
       ├─ java.io.ByteArrayOutputStream
       ├─ java.io.FileOutputStream
       ├─ java.io.FilterOutputStream
       │    ├─ java.io.BufferedOutputStream
       │    ├─ java.io.DataOutputStream
       │    ├─ java.io.PrintStream
       └─ java.net.SocketOutputStream

Stream

  • Stream :java.util.stream.Stream 是 Java 8 中引入的一个接口,用于处理数据序列,支持函数式编程。它提供了许多方便的操作,如过滤、映射、归约等。Stream 可以由各种数据源生成,如集合、数组、文件等。

继承关系图:

复制代码
java.lang.Object
  └─ java.util.stream.BaseStream<T, S extends BaseStream<T, S>>
       └─ java.util.stream.Stream<T>
            ├─ java.util.stream.DoubleStream
            ├─ java.util.stream.IntStream
            └─ java.util.stream.LongStream

区别与关系

  • 目的不同 :InputStream 和 OutputStream 是为了处理字节流的输入和输出,而 Stream 是为了处理元素序列,支持函数式编程操作。
  • 使用场景不同 :InputStream 和 OutputStream 用于低级别的 I/O 操作(如文件读写、网络通信等),而 Stream 用于对数据进行高级操作(如过滤、映射、归约等)。
  • API 不同 :InputStream 和 OutputStream 提供基本的字节读写方法(如 read、write 等),而 Stream 提供丰富的函数式操作方法(如 filter、map、reduce 等)。

示例代码

InputStream/OutputStream 示例
复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class InputStreamOutputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("input.txt");
             FileOutputStream fos = new FileOutputStream("output.txt")) {

            int byteData;
            while ((byteData = fis.read()) != -1) {
                fos.write(byteData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Stream 示例
复制代码
import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world", "java", "stream");

        long count = words.stream()
                          .filter(word -> word.length() > 4)
                          .count();

        System.out.println("Number of words with length greater than 4: " + count);
    }
}

总结

  • InputStream 和 OutputStream 处理字节流的输入输出。
  • Stream 处理数据序列,支持函数式编程。
  • 它们名字相似但功能和用途完全不同,各自适用于不同的场景。
相关推荐
RuoyiOffice4 小时前
Spring AI+Vue3 企业知识库设计:让每个答案有依据,让每份资料守住权限
java·spring boot·vue3·rag·企业知识库·spring ai·ruoyi office
卢锡荣4 小时前
乐得瑞Type-c接口产品描述
c语言·开发语言
晴天的雨.9924 小时前
【C++】模板进阶
开发语言·c++·算法
倔强的石头1064 小时前
【Linux指南】进程通信系列(二):匿名管道 —— pipe 的本质、fork 继承与四种读写规则
java·linux·运维
调试优选官4 小时前
2026年IoT物联网开发赛道年度榜单深度解析:D-coding物联网系统定制与源码交付能力专项解读
java·物联网·struts·iot·开发经验
木井巳4 小时前
【动态规划】三步问题
java·算法·leetcode·动态规划·推荐算法
小张成长计划..4 小时前
【Linux】25:线程概念和控制
java·linux·jvm
蛋蛋的就会顺顺的13 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要82614 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡14 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展