Java读取输入流和union type

InputStream in = ...;
in b = in.read();

对InputStream的读取操作可能发生三种情况:

  1. 异常,抛出IOException;
  2. 读取到一个字节;
  3. 到达输入流的结尾。

其中第2种情况应该返回一个字节(Java中字节的取值范围是-128~127),第3种情况应该返回一个表示“end of file”的特殊对象(暂且叫做EofObject)。所以read()的返回值类型应该是Union<Byte, EofObject>

但是Java用int这一种类型表示了2种情况:

  1. 0~225的整数表示一个字节;
  2. -1表示输入流的结尾。

这种做法带来了一些问题:

  • -1的存在导致了read返回的字节无法直接用Java的byte类型表示,造成了空间浪费;
  • 将read返回的int cast成byte前需要校验值是否为-1,忘记校验或者不小心多做了一次cast都可能引入bug。

P.S. 这里的Union应该是Typed Racket的那种“checked union”,而不是C那样的“unchecked union”。

Union type
Racket Union Types

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,142评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 9,291评论 0 11
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,948评论 0 62
  • 一、直接针对股市的政策影响 我国建立股票市场本身就是国家深化改革开放、积极探索的一个尝试。股票市场的每一步发展都是...
    生活忙碌的猪阅读 8,033评论 0 0
  • 周一上班的时候铁娘子脸色不是很好,估计她也是这几天来大姨妈。 我们的周一总结会足足开了两个小时,好几个人我看到都要...
    你有一条未读信息阅读 3,161评论 0 2

友情链接更多精彩内容