V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
limyel
V2EX  ›  Java

为什么 Java 中那么多操作 IO 流的类呢

  •  
  •   limyel · 2020-03-23 11:41:57 +08:00 · 4292 次点击
    这是一个创建于 1466 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT 为什么 Java 中那么多操作 IO 流 的类,而像 python 就好像很少呢。

    20 条回复    2020-03-23 17:59:22 +08:00
    mritd
        1
    mritd  
       2020-03-23 11:44:55 +08:00 via iPhone
    Go 也是很少 哈哈哈
    fzhyzamt
        2
    fzhyzamt  
       2020-03-23 11:53:34 +08:00
    多无所谓,但是没有原生的简单文件操作就很烦,读个文件要套好几层
    jaylee4869
        3
    jaylee4869  
       2020-03-23 11:59:11 +08:00   ❤️ 2
    曲线救国,装饰者。Java 语言设计上不允许多继承,只能走装饰者模式。
    passerbytiny
        4
    passerbytiny  
       2020-03-23 11:59:17 +08:00
    不算 nio 的话,Java 操作 IO 流的类只有 4 个,其它的全是包装类。
    Cbdy
        5
    Cbdy  
       2020-03-23 12:02:21 +08:00 via Android
    需要关注的就两个类吧,InputStream 、OutputSteam,剩下的都是相关扩展
    zhuangzhuang1988
        6
    zhuangzhuang1988  
       2020-03-23 12:16:16 +08:00
    少嘛?
    又不是叫 stream 的才是 stream,
    有 write, read 的基本就是了
    guili618
        7
    guili618  
       2020-03-23 12:37:25 +08:00   ❤️ 1
    java 为了处理各种输入输出端和它们之间的通信方式而设计了一个统一的抽象,最初的目的是希望避免有过多的类,最后的结果是,处理 io 的类变得很多,讽刺啊——《 java 编程思想》
    gz911122
        8
    gz911122  
       2020-03-23 13:02:02 +08:00
    当时 java 设计的时候脑子抽风了

    后面自己也吐槽说弄得不好
    aguesuka
        9
    aguesuka  
       2020-03-23 13:08:10 +08:00 via Android
    历史遗留问题,nio 里的设计保守得多。举个例子,原来的 PrintOStream 的 print(string)。在 nio 里要用 charset.encode(string)得到 byteBuffer,然后 channel.put(byteBuffer)。
    hantsy
        10
    hantsy  
       2020-03-23 13:20:52 +08:00   ❤️ 1
    @fzhyzamt 读文件好像很简单的,一行代码可以解决吧。了解一下 Java 5 后的 Paths,Files 工具类。

    read by lines, Files.lines( Paths.get(filePath), StandardCharsets.UTF_8)
    read all bytes, Files.readAllBytes( Paths.get(filePath) )
    fzhyzamt
        11
    fzhyzamt  
       2020-03-23 14:34:52 +08:00
    @hantsy 用过,但是 lines 是读成一个 List,对于那种格式文件还要 join,用起来总是有些不舒服,而且涉及文件全都要再指定一次编码,大多数时候都是直接扔个 utf8

    这些设计应该是为了 java 的语言定位吧,可以理解,不过用起来总归不爽
    Wichine
        12
    Wichine  
       2020-03-23 15:08:01 +08:00
    装饰器模式就是可以给你整一大堆类
    varrily
        13
    varrily  
       2020-03-23 15:27:58 +08:00
    反正,能用 Apache IO 就不用 JDK 的。慢慢的也就忘了。
    MakHoCheung
        14
    MakHoCheung  
       2020-03-23 15:35:07 +08:00
    @hantsy Paths 是 7 之后才有,lines 合 readAllBytes 也就只能用来读小文件
    stevenkang
        15
    stevenkang  
       2020-03-23 16:21:10 +08:00
    大概就是这个意思:我封装了你的封装。然后你觉得不好用,你又封装了我封装了你的封装......
    ethanSong
        16
    ethanSong  
       2020-03-23 17:18:13 +08:00
    @stevenkang 太形象了,有点套娃了 学 IO 流时候怀疑人生。
    wuwukai007
        17
    wuwukai007  
       2020-03-23 17:19:49 +08:00
    突然发现 python 任何对象都用 len 一个方法求长度,设计的理念问题
    mightofcode
        18
    mightofcode  
       2020-03-23 17:30:12 +08:00
    因为设计得稀烂
    Qzier
        19
    Qzier  
       2020-03-23 17:31:26 +08:00 via iPhone
    因为 Java 的语言特性和表达能力。
    crc8
        20
    crc8  
       2020-03-23 17:59:22 +08:00
    @stevenkang 套娃?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5440 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 08:37 · PVG 16:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.