news 2026/6/10 14:28:52

java基础-InputStream 类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java基础-InputStream 类

InputStream是 Java 中所有字节输入流的抽象基类,位于java.io包中。它定义了读取字节数据的基本方法。

一、核心特性

  1. 抽象类- 不能直接实例化,需要通过子类实现

  2. 字节流- 以字节(byte)为单位读取数据

  3. 单字节读取- 最基本的读取单位是单个字节(0-255)

  4. 流式访问- 顺序读取,通常不支持随机访问

二、常用方法

// 基本读取方法 int read() // 读取单个字节,返回0-255,-1表示结束 int read(byte[] b) // 读取到字节数组,返回实际读取字节数 int read(byte[] b, int off, int len) // 读取指定长度到数组的指定位置 // 其他重要方法 long skip(long n) // 跳过指定字节数 int available() // 返回可读取的字节数(估计值) void close() // 关闭流,释放资源 void mark(int readlimit) // 标记当前位置 void reset() // 重置到标记位置 boolean markSupported() // 是否支持标记/重置

三、主要子类

1. 文件输入流

FileInputStream fis = new FileInputStream("file.txt");

2. 字节数组输入流

ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);

3. 缓冲输入流(装饰器)

BufferedInputStream bis = new BufferedInputStream(inputStream);

4. 对象输入流(反序列化)

ObjectInputStream ois = new ObjectInputStream(inputStream);

5. 其他子类

  • PipedInputStream- 管道流

  • SequenceInputStream- 序列流

  • FilterInputStream- 过滤流基类

  • DataInputStream- 读取基本数据类型

四、使用示例

示例1:基本读取

try (InputStream is = new FileInputStream("test.txt")) { int data; while ((data = is.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); }

示例2:使用缓冲区读取

try (InputStream is = new FileInputStream("largefile.bin"); BufferedInputStream bis = new BufferedInputStream(is)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = bis.read(buffer)) != -1) { // 处理读取的数据 processData(buffer, bytesRead); } } catch (IOException e) { e.printStackTrace(); }

示例3:读取到字节数组

public static byte[] readAllBytes(InputStream inputStream) throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] data = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(data, 0, data.length)) != -1) { buffer.write(data, 0, bytesRead); } return buffer.toByteArray(); }

五、重要注意事项

1.资源管理

// 推荐使用 try-with-resources try (InputStream is = new FileInputStream("file.txt")) { // 使用流 } // 自动关闭

2.读取性能

  • 单字节读取性能差,建议使用缓冲区

  • BufferedInputStream可以显著提升性能

  • 合适的缓冲区大小(通常4KB-8KB)

3.异常处理

try { // 读取操作 } catch (IOException e) { // 处理IO异常 } finally { // 确保关闭资源(try-with-resources更优) }

4.标记/重置限制

  • 不是所有流都支持mark()reset()

  • 标记有读取限制(readlimit参数)

  • 调用reset()前必须先调用mark()

六、与 Reader 的区别

特性InputStreamReader
单位字节(byte)字符(char)
编码无编码概念使用字符编码
范围0-255Unicode字符
子类FileInputStream等FileReader等

七、最佳实践

  1. 始终关闭流- 使用 try-with-resources

  2. 使用缓冲区- 特别是对于文件或网络流

  3. 检查返回值-read()方法可能读取不到预期字节数

  4. 考虑使用 NIO- 对于高性能需求,考虑Files.newInputStream()

  5. 处理中断- 考虑使用Thread.interrupted()检查

八、Java 9+ 新增方法

// Java 9 新增 byte[] readAllBytes() // 读取所有字节 long transferTo(OutputStream out) // 直接传输到输出流 // Java 11 新增 byte[] readNBytes(int len) // 精确读取指定数量的字节
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:08:24

2026年10款主流项目管理软件精选推荐|高效落地团队协作

选对项目管理软件,能大幅降低沟通成本、精准把控项目进度,让团队从繁琐的手动跟进中解放出来。精选10款主流易上手的项目管理工具。 进度猫(轻量进度可视化工具) • 核心优势:甘特图思维导图双向联动,关键路…

作者头像 李华
网站建设 2026/6/10 13:45:54

创客匠人AI智能体:破解创始人IP打造的“时间黑洞“难题

在内容创业的激烈竞争中,创始人IP打造正陷入一个致命困境:时间黑洞。创始人被琐碎的日常运营耗尽精力,无法专注于核心价值创造。数据显示,70%的内容创业者因时间管理不善,导致IP增长停滞甚至衰败。而创客匠人通过AI智能…

作者头像 李华
网站建设 2026/6/10 11:10:50

【大数据毕设选题推荐】Python+Hadoop王者荣耀账号交易信息可视化分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡如果你遇到具体的…

作者头像 李华
网站建设 2026/6/10 13:07:35

红松小课62岁失独妈妈学琴重塑人生,要活成女儿最想看到的样子

​“人到晚年,最怕的不是身体老去,而是心里没了盼头。”这是我国超3亿老年人中,不少人的真实写照——退休后的孤独感、精神寄托的缺失,让本该从容的晚年陷入迷茫。而遭遇人生重创的群体,更难走出这种困境。在退休生活兴…

作者头像 李华
网站建设 2026/6/10 13:13:59

登峰舰队,中国新一代资本合力体系的开创者与引领者

在中国资本市场三十余年的发展历程中,每一次格局演变,都会催生出一批真正具备时代代表意义的顶级资本力量。从最初的散户时代,到公募机构时代,再到游资崛起时代,如今,中国资本市场正全面迈入资本合力时代。…

作者头像 李华
网站建设 2026/6/10 10:12:07

CDN与边缘缓存策略——静态、动态与签名鉴权的组合拳

写在前面,本人目前处于求职中,如有合适内推岗位,请加:lpshiyue 感谢。同时还望大家一键三连,赚点奶粉钱。本系列已完结,完整版阅读课联系本人 现代内容分发不是简单的缓存填充,而是静态加速、动…

作者头像 李华