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

2020-03-23 11:41:57 +08:00
 limyel

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

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

后面自己也吐槽说弄得不好
aguesuka
2020-03-23 13:08:10 +08:00
历史遗留问题,nio 里的设计保守得多。举个例子,原来的 PrintOStream 的 print(string)。在 nio 里要用 charset.encode(string)得到 byteBuffer,然后 channel.put(byteBuffer)。
hantsy
2020-03-23 13:20:52 +08:00
@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
2020-03-23 14:34:52 +08:00
@hantsy 用过,但是 lines 是读成一个 List,对于那种格式文件还要 join,用起来总是有些不舒服,而且涉及文件全都要再指定一次编码,大多数时候都是直接扔个 utf8

这些设计应该是为了 java 的语言定位吧,可以理解,不过用起来总归不爽
Wichine
2020-03-23 15:08:01 +08:00
装饰器模式就是可以给你整一大堆类
varrily
2020-03-23 15:27:58 +08:00
反正,能用 Apache IO 就不用 JDK 的。慢慢的也就忘了。
MakHoCheung
2020-03-23 15:35:07 +08:00
@hantsy Paths 是 7 之后才有,lines 合 readAllBytes 也就只能用来读小文件
stevenkang
2020-03-23 16:21:10 +08:00
大概就是这个意思:我封装了你的封装。然后你觉得不好用,你又封装了我封装了你的封装......
ethanSong
2020-03-23 17:18:13 +08:00
@stevenkang 太形象了,有点套娃了 学 IO 流时候怀疑人生。
wuwukai007
2020-03-23 17:19:49 +08:00
突然发现 python 任何对象都用 len 一个方法求长度,设计的理念问题
mightofcode
2020-03-23 17:30:12 +08:00
因为设计得稀烂
Qzier
2020-03-23 17:31:26 +08:00
因为 Java 的语言特性和表达能力。
crc8
2020-03-23 17:59:22 +08:00
@stevenkang 套娃?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/655301

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX