在Java里InputStream和OutputStream如何使用_Java字节流读取写入说明-java教程

InputStream读取常阻塞或读不到数据,根本原因是未检查read()返回值;返回-1表示流结束,0表示暂无数据,盲目循环致CPU空转;批量读需用返回值控制写入长度,网络流须设超时,文件流推荐Files.newInputStream()。

InputStream 读取字节时为什么经常阻塞或读不到数据?

根本原因通常是调用 read() 方法后没检查返回值,或误以为每次都能读满缓冲区。该方法返回实际读到的字节数,-1 表示流已结束;返回 0 不代表结束,而是本次无数据可读(比如网络流暂无新包),盲目循环会导致 CPU 空转。

  • 始终用 int b = in.read() 判断,而非 in.read() != -1 在 while 条件里重复调用(会跳过第一个字节)
  • 批量读取优先用 read(byte[] b),但必须用返回值控制写入长度:int len = in.read(buf); out.write(buf, 0, len);
  • 网络或管道类流需配合超时设置(如 Socket.setSoTimeout()),否则可能无限等待
  • 文件类流建议用 Files.newInputStream() 替代裸 FileInputStream,自动处理路径和异常

OutputStream 写入后文件为空或内容不全?

最常见原因是忘了调用 flush() 或 close()。缓冲区未刷新时,数据还卡在内存里,进程退出前若未显式刷出,就直接丢失。

  • write() 只是把数据塞进缓冲区,不保证落盘;flush() 强制清空缓冲区,close() 会隐式调用 flush(),但依赖 try-with-resources 更安全
  • 避免手动 close():用 try (OutputStream out = new FileOutputStream("a.txt")) { ... },即使异常也能释放资源
  • 追加写入要传 true 给 FileOutputStream 构造函数:new FileOutputStream("log.txt", true)
  • 小量数据(如单个 byte)直接用 write(int b) 即可,别硬套 byte[] 缓冲区

InputStream 和 OutputStream 能否直接转换成 String?

不能直接强转,必须经过编码解码。字节流本身无字符概念,String 是 Unicode 字符序列,中间必须指定字符集,否则默认平台编码(Windows 是 GBK,Linux/macOS 通常是 UTF-8),极易乱码。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里InputStream和OutputStream如何使用_Java字节流读取写入说明-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995616+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995616+
  • 本周更新: 0+
  • 最后更新: 2026-03-16