为什么我觉得 Java 的 IO 很复杂_-大概是条废咸鱼
初学者觉得复杂是很正常的,归根结底是因为没有理解JavaIO框架的设计思想:
可以沿着这条路想一想:
1,学IO流之前,我们写的程序,都是在内存里自己跟自己玩。比如,你声明个变量,创建个数组,创建个集合,写一个排序算法,模拟一个链表,使用一些常用API,现在回想一下,是不是在只是自己在内存里玩一玩?计算机组成包括运算器,控制器,存储器,输入设备,输出设备。那么你前面的工作,仅仅够你的程序和内存以及CPU打打交道,如果你需要操作外部设备呢?比如键盘,显示器,再比如,最常见的外设:硬盘?甚至未来世界里的每家每户都有的机器人,“如何让你的程序和机器人进行交互呢?”
2,所以程序设计语言必须要提供程序与外部设备交互的方式,这就是IO框架的由来。我们需要和外部设备进行数据的交互。那么,计算机是通过什么和外部进行交互的呢?很简单就能想到:数据线。数据线里传播的是什么呢?一个词:比特流。比特就是bit的谐音,计算机中“位”的意思,代表0或1。1位或者1bit,就是一个0或一个1。但是,毕竟0或1不能表示什么,所以计算机更常见的基本单位是字节,也就是用8位0或1组成的一段数据。以上是对比特流的由来做一个简单地解释。(比特流一词来自于计算机网络原理中,对物理层传输内容的描述:物理层(网线)中传输的是“比特流”,在这里借用这个名词代指数据的表示形式,帮助理解)
上面两段话的意思,其实是为了下文做铺垫,帮助理解输入输出最重要的概念:方向性。输入还是输出,是相对于程序或者说相对于内存而言的。数据从外流到内存,就是输入(读),数据从内存出去,就是输出(写)。
3,既然计算机和外界进行信息的输入和输出交互,用的是比特流,那么很容易就能想到IO流名字的由来了。就是比喻输入输出的数据像流一样。我们可以这么认为,任何外部设备与内存之间输入输出的操作,都是需要输入输出流(IO流)来完成的,这里的IO流,指的就是比特流(或者称字节流)。这些外部设备,包括,键盘(标准输入设备),显示器(标准输出设备),音响,网络上另一台主机,甚至你玩游戏用的游戏手柄,以及各种各样的信号传感器,都可以叫做外部设备,和这些设备之间进行数据交互,显然不可能靠之前学习的那些数组,集合,常用类,String等等来完成。而是要靠和外界数据交换的类来完成。靠什么来进行数据交换,就是前面说的,比特流,或者说IO流类。
4,那么,既然要学习IO流,就得针对某一个输入输出设备来学习。哪种输入输出设备最重要同时也最常见?当然是硬盘。硬盘在这里的含义也可以理解为文件系统。(Java程序是运行在某操作系统平台上的应用软件JVM上的,实际上Java程序可见的并不是硬盘,而是操作系统提供的文件系统,因此此处可直接理解为文件系统)。因此,我们学习IO流的时候,基本上是学习的Java如何操作文件系统,除了文件系统,我们还能够了解Java操作标准输入输出设备,如http://System.in和System.out。
5,知道了学习的方向,是要使用Java操作文件系统,那么首先要学习的就是文件的表示,即File类。然后,我们要操作做文件,虽然我们大部分操作都是操作文件系统,但是要明白IO流的概念不仅仅局限在操作文件上,前面我已经提到了,我们的编程语言是要能操作所有的输入输出,因此,API提供了两个顶层抽象类,用来表示操作所有的输出输出:InputStream,OutputStream。并且,这两个类表示字节的输入输出,因为输入输出的本质是字节流。这里注意体会一句话“字节流是最最基本的流”,这句话的由来就是因为计算机底层传递的就是字节。那么,当我们要操作文件的时候,就需要具体的对文件系统操作的IO实现类,于是我们需要学习FileInputStream和FileOutputStream,它们是文件输入输出字节流。这里之所以FileInputStream/OutputStream作为子类出现,按照面向对象思想理解就是,将来还有别的字节流来操作别的设备(比如将来需要通过操作网络设备获取网络数据,再比如需要操作机器人,那么或许就会再来个RobotInputStream和RobotOutputStream,这些新的需求也就都可以继承这个体系)
(这里顺便提一句架构设计思想,其中有一种设计原则叫“开闭原则”,其核心是:一个对象对扩展开放,对修改关闭。就是说,一旦写好了某个类,就不要去轻易改动他,而是要保证它一直能运行下去,而面对新的功能需求时,只要在原有代码上增加即可,而不是修改原有代码。要做到开闭原则,就需要分清需求中未来哪些部分是稳定的,哪些是很可能变化的,而往往抽象的部分是最稳定的,把稳定的内容分离出来,就能满足开闭原则。这就是为什么Java的类设计的如此之琐碎,为什么我们要从继承关系角度去理解JavaIO流的设计)
6,学了文件IO字节流之后,我们会发现原始的字节流对象用起来没那么高效,因为每个读或写请求都由底层操作系统处理,这些请求往往会触发磁盘访问、网络活动或其他一些相对昂贵的操作。不带缓冲区的流对象,只能一个字节一个字节的读,每次都调用底层的操作系统API,非常低效,而带缓冲区的流对象,可以一次读一个缓冲区,缓冲区空了才去调用一次底层API,这就能大大提高效率。所以又有了BufferedInputStream和BufferedOutputSteam,他们的用法是把字节流对象传入后再使用,也相当于把它俩套在了字节流的外面,给字节流装了个“外挂”,让基本字节流如虎添翼。
7,说到操作文件,就不得不提到文件的分类和编码格式。文件分为二进制文件和文本文件,二进制文件是用记事本打开后看不懂的,他们的编码格式是特殊的,比如pdf文件,exe文件。记事本打开后人能看懂的只有纯文本文件,我们处理文件(或者说处理任何的字节流),就免不了处理一些文本文件(或文本字节流)。如果是英语国家的人还好说,因为他们是用的常用字符用一张ASCII码表就能表示得出来,用一个字节就能表示一个字母。但是显然,对非英语国家的人来说,一个字节的大小无法表示他们所有的文字。因此,人们需要有能够处理字符的类,或者说这个类提供一个功能:就是把输入的字节转成字符,把要输出的字符转成计算机可以识别的字节。所以,你需要两个转换流:InputStreamReader和OutputStreamWriter。这两个类的作用分别是把字节流转成字符流,把字符流转成字节流。但是这两个流需要套在现成的字节流上才能使用,当中用到的设计模式也就是常说的装饰模式。当字节流被转成字符流之后,恭喜你,你可以不必操作字节流了,而是可以用人类的方式read和write各种“文字”。
(那么,我们为什么还要学习字节流?因为字节流依然有它的作用范围。首先,所有的流都是建立在字节流之上的,比如字符流。字节流或许可以读任何字节,但是他处理不了Unicode(万国码),他处理不了Data流,Object流,也就是说,它做不了高级的事情,只能读写最原始的东西。字节流好比动物,能看,能听,能汪汪叫,但是他不能读书,不能写字,不能理解更高级的知识。其次要注意的是,字符流只能用来处理文本文件,也就是只能来处理字符,如果出来用来处理二进制文件,会带来错误,所以处理二进制文件只能用字节流)
8,还是回到文件系统,我们最常见的是和文件系统打交道,那么针对如此常见的用途,读取文本文件能不能用一种方便的方式呢?当然,大牛们替你想到并提供了。FileReader和FileWriter这两个流对象可以直接把文件转成读取、写入流。让你省去了创建字节流,再套上转换流的步骤。看看这类名起的,实际上很形象,xxxReader和xxxWriter,明摆着告诉你“阅读和书写”都是“人可以做的”也就是他们表示的是字符流。同理上面的InputStreamReader和OutputStreamWriter,表示的是把字节流转成人可读的,把字节流转成人可写的。因此他们的顶层抽象类:Reader和Writer,表示的是所有人类可读可写的字符流统称。
10,同上面说的缓冲区的作用,再把Reader和Writer做成高效的,就需要BufferedReader和BufferedWriter,把它们套在Reader和Writer上,就能实现高效的字符流。
11,讲到这里,IO流的大概思想已经说的的差不多了,是不是觉得之前混乱的那些类,现在知道他们的作用和设计思想以后,稍稍清晰了许多呢?可以简单的记,字节流是基础,理论上可用于所有的输入输出场景,内容是文字的字节流可以通过转换流转成字符流,转换流是字节流和字符流之间相互转换的桥梁,把字节流转成字符流,离不开转换流,字符流是对于字符功能的增强可用来处理“文字”,操作文件系统应用范围最广,所以JDK提供了现成的FileXXX类,用来方便编程使用。另外,还有许多类是“在内存里自己和自己玩的”比如ByteArrayReader/Writer,PipedWriter/Reader,它们虽然也称为“流对象”但是他们的数据不出内存,所以它们的close()方法可有可无。以及其他带有某些功能的类,比如序列化流,比如数据输入输出流,等等。IO流对象的用法和作用大同小异,其使用环境和意义取决于具体需要,用到了再具体分析即可。
这里先写到这了。这里作为Java编程入门应该可以了,主要介绍了JavaIO框架的设计思想,但具体底层实现细节,还需要学习JVM相关知识,以及微机原理和接口技术等等底层的课程。
------
本来想改改答案做一些补充之类的,发现越改越垃圾,当中的有些话未免显得突兀,不如当初一气呵成写下的答案思维连贯,如今只能靠读者自己仔细阅读了,应该能把思路连起来。以后不改了。希望能帮到初学者一点点。
评论区
大概是条废咸鱼: 匿名的原因给大家解释一下,自己不是什么大牛,仅仅是想让自己的答案能够帮助到需要帮助的人,除此之外就没有任何目的了。另外,自己比较看不惯知乎那群抖机灵的人,明明自己理解了某个知识,却以抖机灵的形式让新手仍然处在云里雾里。匿名的好处有很多,比如,可以减少杠精,万一写的不好引来喷子,自己的心理负担也会少很多。另外,希望断绝自己靠出名牟利的念头,希望年轻时踏实的做技术,而不是卖弄。 👍🏽462 💭N/A IP 🕐2020-05-28 09:30:52
│ └── 张忌无: 交流学习氛围 赞 👍🏽4 💭N/A IP 🕐2020-05-28 09:32:24
│ └── 陈凡: 你这个把知识串起来的思维,真的太赞了,一下子学了一套还知道了它们的由来。 👍🏽25 💭N/A IP 🕐2020-05-28 10:19:27
│ │ └── 定洋: 高屋建瓴[赞同] 👍🏽0 💭N/A IP 🕐2022-02-17 17:47:40
│ └── 漂泊的太阳: 支持答主![机智] 👍🏽2 💭N/A IP 🕐2020-05-28 10:53:00
│ └── 浪里个浪打浪: 高屋建瓴! 👍🏽6 💭N/A IP 🕐2020-05-28 14:41:39
│ └── codingBug: tql,真的服 👍🏽0 💭N/A IP 🕐2020-05-28 21:10:06
│ └── 骨头: 好想关注哦,看完你的回答觉得有开窍的感觉 👍🏽5 💭N/A IP 🕐2020-05-28 22:11:25
│ └── Autumns: 佩服 👍🏽0 💭N/A IP 🕐2020-05-29 04:21:59
│ └── 归宅码居: 别匿了,想关注下,继续看这么高质量的回答。 👍🏽2 💭N/A IP 🕐2020-06-01 09:37:35
│ └── odin: 正道的光!感谢 👍🏽0 💭N/A IP 🕐2020-06-04 10:37:45
│ └── vip: 知其然还知其所以然。 写的很好。想看别的佳作! 👍🏽0 💭N/A IP 🕐2020-06-06 14:39:45
│ └── 相见时难别亦难: 非常感谢写的太好了 👍🏽1 💭N/A IP 🕐2020-06-07 16:32:36
│ └── 不学无术者: 写的很棒,谢谢你 👍🏽1 💭N/A IP 🕐2020-06-09 00:51:52
│ └── hello world: 谢谢,写的很好 👍🏽0 💭N/A IP 🕐2020-06-13 17:57:11
│ └── 流量卡大师兄: 这才是知乎,这才是知乎! 👍🏽1 💭N/A IP 🕐2020-06-24 11:26:18
│ └── 剪水2: 谢谢楼主啦,思维清晰,逻辑缜密,语言流畅,知识化繁为简,谢谢分享[欢呼] 👍🏽1 💭N/A IP 🕐2020-06-27 23:49:24
│ └── 馆长: 很棒,谢谢楼主 👍🏽0 💭N/A IP 🕐2020-07-11 21:00:46
│ └── ltax: 谢谢 👍🏽0 💭N/A IP 🕐2020-09-25 10:19:05
│ └── 亚诺: 高屋建瓴 👍🏽1 💭N/A IP 🕐2020-12-04 16:33:37
│ └── VanGogh: 高屋建瓴 👍🏽0 💭N/A IP 🕐2021-08-09 21:45:05
│ └── 无忧: 格局 👍🏽0 💭N/A IP 🕐2021-09-29 18:26:55
│ └── 战斗力旺盛的怕爵: 学过单片机的我学到IO流,终于感觉JAVA能为我所用了[害羞] 👍🏽0 💭N/A IP 🕐2021-10-21 07:31:21
│ └── 顽石: 格局上去了 👍🏽0 💭N/A IP 🕐2021-11-03 16:16:04
我吃红苹果: 写的这么好干嘛要匿名[好奇] 👍🏽39 💭N/A IP 🕐2020-05-28 07:46:19
│ └── the soulmate: 同种想法 👍🏽6 💭N/A IP 🕐2020-05-28 08:54:09
│ └── 卜史: [赞同] 👍🏽0 💭N/A IP 🕐2021-01-24 14:26:59
东郭晓白: 这才是我想看的知乎[欢呼] 👍🏽36 💭N/A IP 🕐2020-05-28 09:52:22
Joker: 别匿名,看我不关注你丫的 👍🏽24 💭N/A IP 🕐2020-05-28 08:08:36
追风筝的人: 写得好好,知识串起来了,答主能否也讲讲NIO 👍🏽16 💭N/A IP 🕐2020-05-28 07:59:36
│ └── 刘金彪: nio就是非阻塞的io,bio面向流,nio面向块,bio一条线程处理一个io,nio一条线程处理多个io。 👍🏽7 💭N/A IP 🕐2020-05-28 23:03:20
艾梅达尔: 终于对IO有个清晰明了的认识了 👍🏽9 💭N/A IP 🕐2020-05-28 07:30:49
│ └── 卜史: [赞同]感谢答主 👍🏽1 💭N/A IP 🕐2021-01-24 14:26:42
清风几许: 很赞,相比那种一上来丢一堆高大上的名词那种答案,答主这样从用途根源来解释,真的很容易记住,[赞同],对我这种半路出家学习的人真的超级友好了[耶] 👍🏽5 💭N/A IP 🕐2020-05-28 10:03:00
知乎用户3PsbPL: 正好学到这里,看了答主的文章对于io有些概念了,支持! 👍🏽4 💭N/A IP 🕐2020-05-28 09:13:15
yfyfyf: 感觉JAVA里Reader和Writer名字起的不是很好,应该叫CharacterInputStream和CharacterOutputStream才容易理解 👍🏽3 💭N/A IP 🕐2020-06-23 17:00:35
│ └── 大概是条废咸鱼: 嗯,我觉得你说的有道理,想法很好 👍🏽0 💭N/A IP 🕐2020-06-23 21:28:57
贰零零: 通俗易懂的典范,而且很怀疑JDK作者们的开发思路,命名思路,就是按照这个来的,把字符流对应Reader/Writer,表示人类可读的。经此一文,终于能够对BIO的三杆枪深入理解了一层。感谢,Peace&Love 👍🏽2 💭N/A IP 🕐2020-06-10 14:19:59
欧阳乐燊: 你是老师么[为难][为难][为难] 👍🏽2 💭N/A IP 🕐2020-05-28 20:15:31
Vincent: 博主,喜欢你的这种探究问题的思路,像你学习,请问我可以转载写篇文章到公众号吗?会著名出处。 👍🏽1 💭N/A IP 🕐2021-12-04 14:50:20
│ └── 大概是条废咸鱼: 可以 👍🏽0 💭N/A IP 🕐2021-12-25 09:04:32
卖竹鼠三元一只: 写得太好了,作者有博客什么的吗,想关注一下 👍🏽11 💭N/A IP 🕐2020-05-28 07:56:41
张伟: 为啥匿名,写得挺好的呀 👍🏽5 💭N/A IP 🕐2020-05-28 08:30:40
凿壁砸缸: 有推荐的资料看吗,静等后续。 👍🏽4 💭N/A IP 🕐2020-05-28 02:00:56
客串一回: 你是说nio吗? 👍🏽4 💭N/A IP 🕐2020-05-27 23:01:32
│ └── 橙123: 这是bio 👍🏽5 💭N/A IP 🕐2020-05-28 07:42:39
│ └── Flickerh: InputStream或OutputStream以及其子类都是属于BIO(Block IO),包括Buffered(Input|Output)Stream。NIO是Buffer、Channel、Selector。 👍🏽5 💭N/A IP 🕐2020-05-29 16:27:45
│ │ └── 客串一回: 我知道,bio不复杂,nio才算复杂 👍🏽0 💭N/A IP 🕐2020-05-30 08:44:29
│ │ └── mister24: 你都说知道了还问是不是nio,什么鬼逻辑,学习可不能不懂装懂做一个掩盖过失的猫。 👍🏽2 💭N/A IP 🕐2020-06-20 08:55:54
│ └── 客串一回: 问题是bio不复杂啊? 👍🏽0 💭N/A IP 🕐2020-06-20 09:05:49
│ └── 路人: 问题是nio比bio简单啊 👍🏽0 💭N/A IP 🕐2020-09-10 02:48:39
我点灯: 斯国一。。。大佬,我可以转载到我的博客吗 👍🏽3 💭N/A IP 🕐2020-05-28 09:48:53
│ └── 大概是条废咸鱼: 转吧,不过,我将来要改进的,昨天写到后面就写不动了,于是草草收尾。。。 👍🏽0 💭N/A IP 🕐2020-05-28 09:54:56
│ └── 我点灯: 额,你是匿名的,我不知道该怎么注明出处,你有博客链接吗 👍🏽0 💭N/A IP 🕐2020-05-28 09:56:08
夏天: 为什么不出书?我觉得你有潜质! 👍🏽2 💭N/A IP 🕐2020-05-29 21:37:39
│ └── 大概是条废咸鱼: 等我40岁之后,搞懂那些更晦涩难懂的技术后,一定出书!这篇文章就是帮助小白的[干杯] 👍🏽4 💭N/A IP 🕐2020-05-29 23:00:13
辣椒竹笋炒肉: 写得实在是太好了,通俗易懂 👍🏽2 💭N/A IP 🕐2021-02-19 20:01:48
│ └── 大概是条废咸鱼: 真没想到这个回答能换来这么多感谢,谢谢 👍🏽0 💭N/A IP 🕐2021-02-19 20:25:41
我想拥有时光机: 2里边的读和写是不是写反了? 👍🏽1 💭N/A IP 🕐2020-05-28 11:25:27
│ └── 大概是条废咸鱼: 没写反,程序读就是输入,程序写就是输出。这块的确不好理解。 👍🏽1 💭N/A IP 🕐2020-05-28 11:34:34
│ │ └── 我想拥有时光机: 哦哦 是我理解反了 谢谢![飙泪笑][飙泪笑] 👍🏽0 💭N/A IP 🕐2020-05-28 12:23:18
│ │ └── Sharlock Holmes: 我读到这里也停顿了下 最后总结下就是 内存读 内存写 硬盘里是字节 👍🏽0 💭N/A IP 🕐2020-05-30 21:21:23
│ └── 一只大榴莲: 读到内存read,写到硬盘write 👍🏽2 💭N/A IP 🕐2020-06-01 18:57:40
│ └── 一只大榴莲: 这是站在内存的角度,看是流入内存还是流出内存 👍🏽2 💭N/A IP 🕐2020-06-01 18:58:49
│ └── 蒲弋筝: 没有写反,计算机通过程序理数据是在内存中,数据从硬盘(存储器)进入内存(CPU),是读;程序在CPU处理完数据输出到硬盘(存储器),是写。答主写的不错,从不同的角度结构了这个IO知识点。赞! 👍🏽1 💭N/A IP 🕐2020-08-24 20:19:58
│ │ └── 我想拥有时光机: 是的😂我角度站反了。谢谢你们的解读! 👍🏽0 💭N/A IP 🕐2020-08-24 21:01:03
│ └── 朝闻道: 读入,写出 👍🏽0 💭N/A IP 🕐2023-02-04 14:00:04
│ └── 我想拥有时光机: read write 👍🏽0 💭N/A IP 🕐2023-02-04 16:05:52
一个想变强的萌新: 这才是通俗易懂,一目了然 👍🏽1 💭N/A IP 🕐2020-05-28 10:58:27
肖志东: 专门登录账号,就是想发一句,多谢答主!以前看到IO就怕,现在竟然能理解了 👍🏽1 💭N/A IP 🕐2021-09-27 14:43:24
Q L: [赞同] 👍🏽0 💭N/A IP 🕐2024-11-06 20:21:13
苦海: 哥,你真厉害。你有博客吗 👍🏽0 💭N/A IP 🕐2023-11-27 14:44:06
北冥有鱼: 赞 👍🏽0 💭N/A IP 🕐2023-08-19 10:41:47
Wojak: 这种文章需要多拜读几次 👍🏽0 💭N/A IP 🕐2023-05-14 21:22:16
123456: 说明提问者不是科班,操作系统里文件系统说的清清楚楚IO,拿到Java上就不会了,说不过去。 👍🏽0 💭N/A IP 🕐2023-03-27 04:26:28
Cvkvl: 写的真透彻 👍🏽0 💭N/A IP 🕐2023-03-08 15:30:23
pureayu: 卧槽牛逼,之前怎么都搞不清记不住,现在非常清晰,已经掌握了 👍🏽0 💭N/A IP 🕐2023-01-24 09:15:35
知乎用户bDV7Ir: 就想说一句 一个open能解决的事情 你md搞这么复杂 而大多java程序员用的更多的竟然增删改查 搞不好一辈子都不知道流是什么 👍🏽0 💭N/A IP 🕐2021-11-26 22:22:36
达盖尔的旗帜: 那么nio呢 👍🏽0 💭N/A IP 🕐2021-11-23 19:53:21
北冥有鱼: 底层写的很清晰~ 👍🏽0 💭N/A IP 🕐2021-11-04 12:32:14
李白龙: Java菜鸡飘零半生,只恨未逢名师,今日听君一语,如拨云见日,茅塞顿开!公若不弃… … [机智] 👍🏽0 💭N/A IP 🕐2021-11-02 13:13:47
雪痕心迹: 感谢好人 👍🏽0 💭N/A IP 🕐2021-10-29 11:54:47
World Ho: 不错。本来能还明白一点的。看了你的解释后完全不明白了:) 👍🏽0 💭N/A IP 🕐2020-07-05 23:22:27
tomatoya: 很棒的回答 👍🏽0 💭N/A IP 🕐2020-07-02 20:19:03
Reso1ution: 大佬再写这些面向新手的,该去哪里看啊。。。 👍🏽0 💭N/A IP 🕐2020-06-27 17:24:58
借我: 感谢,最近刚好在看字节流经过装饰流转变为字符流,来获取一些带有汉语文字的数据,看完感觉有点清晰了,再次感受到逻辑思维的厉害,可以一步步把技术讲清楚。 👍🏽0 💭N/A IP 🕐2020-06-26 01:35:22
yfyfyf: 并且,我觉得教授编程语言,如果要考虑硬件的特性,那么就要结合计算机硬件来讲,告诉学习者计算机的硬件是什么样的,有什么特点,我们的编程语言是怎么根据这些特点来设计的 👍🏽0 💭N/A IP 🕐2020-06-23 17:02:19
│ └── 大概是条废咸鱼: 是的,这可以概括为国内教育的缺失吧。西方的教材中,这方面内容讲的细致些。或者,学习者不容易找到相关领域的“通识”或“科普”类教材。往往这些教材上会涉及这些看似和编程语言无关的内容。 👍🏽0 💭N/A IP 🕐2020-06-23 21:31:34
小牛: 这篇文章写的真TM棒 👍🏽0 💭N/A IP 🕐2020-06-16 16:39:47
乜许会心痛: 通俗易懂,很有意思 👍🏽0 💭N/A IP 🕐2020-06-15 21:27:23
东吴逍遥侠客: 写的通俗易懂,我喜欢这种答案 👍🏽0 💭N/A IP 🕐2020-06-15 06:40:12
huanyuyiqi: 思路非常清晰[赞][赞]~学习了 👍🏽0 💭N/A IP 🕐2020-06-14 18:13:03
明月清风: 非常棒,很清楚了 👍🏽0 💭N/A IP 🕐2020-06-13 09:46:20
Ccoder: 非常好 👍🏽0 💭N/A IP 🕐2020-06-12 12:09:02
你好四季: 很好,看完思路有点清晰了,可以说为学习io打开一扇门。谢谢。 👍🏽0 💭N/A IP 🕐2020-06-09 16:58:30
momo: 感谢答主! 👍🏽0 💭N/A IP 🕐2020-06-09 12:01:37
shelter: 楼主讲的挺好的,我补充一个小地方,就是处理流那里还牵扯了一类设计模式,装饰设计模式,其在形式上和代理模式很像,但在本质上又有区别,深入理解Java源码的设计有时候对自己的编程无异于是一种很好的提升方法 👍🏽0 💭N/A IP 🕐2020-06-09 10:09:44
断臂残猿: 你是王垠吗[吃惊] 👍🏽0 💭N/A IP 🕐2020-06-08 10:43:26
vip: 能不能稍稍的联系我。粉你了! 👍🏽0 💭N/A IP 🕐2020-06-06 14:45:30
Seed: 答主,我想知道你是怎么知道的这些知识的,通过看书么? 👍🏽0 💭N/A IP 🕐2020-06-05 17:51:56
轻云: 归纳的很好 👍🏽0 💭N/A IP 🕐2020-06-05 12:32:13
winterccc: 解除了我很多疑惑 👍🏽0 💭N/A IP 🕐2020-06-04 20:56:18
刘兰猗: 感谢作者 说的很清晰 👍🏽0 💭N/A IP 🕐2020-06-04 02:15:28
落犁: 勾起了我痛苦的回忆 👍🏽0 💭N/A IP 🕐2020-06-03 19:30:06
WJQNF: 瞬间醒悟…thankyou 👍🏽0 💭N/A IP 🕐2020-06-03 16:40:02
谁的青春太完美: 想问一下大佬,http请求过来,服务器接收,这种属不属于IO流的一部分呢? 👍🏽0 💭N/A IP 🕐2020-06-02 12:43:44
│ └── 玉晨君: IO流,顾名思义,就是输入输出流,你说的这种就是平常大家说的网络IO,例如 Java socket 建立一个客户端到服务端的连接,其两者之间交换数据实际上也是通过IO流进行的 👍🏽1 💭N/A IP 🕐2020-06-13 11:21:12
吾心: 大佬啊,正好学习了这块,看完之后感觉知识点串起来了 👍🏽0 💭N/A IP 🕐2020-06-02 11:42:50
voidplus: 茅塞顿开,好想关注你[小情绪] 👍🏽0 💭N/A IP 🕐2020-06-01 22:33:17
flybug: 大佬,我可以转载到我的博客吗[欢呼] 👍🏽0 💭N/A IP 🕐2020-06-01 21:07:24
众善奉行: 写的真的不错,清晰了很多 👍🏽0 💭N/A IP 🕐2020-06-01 18:45:35
广州十三幺: 大佬为何匿名 👍🏽0 💭N/A IP 🕐2020-06-01 15:07:23
叔于田蒸蒸: 好文要顶,精神要赞!!![赞同][赞同][赞同] 👍🏽0 💭N/A IP 🕐2020-06-01 08:14:14
黄军凯: 有帮助 👍🏽0 💭N/A IP 🕐2020-06-01 01:03:18
clovia: 一股清流,爱看 👍🏽0 💭N/A IP 🕐2020-05-31 13:45:16
天方一水: 大佬,语言连贯,条理清晰,确实收获不小;话说为什么要匿名,本来想关注一下的[飙泪笑] 👍🏽0 💭N/A IP 🕐2020-05-31 10:12:21
A导: 哇,真醍醐灌顶 👍🏽0 💭N/A IP 🕐2020-05-31 00:06:45
知乎用户26U9g2: 比特流和字节流是一个概念么?比特流不是0、1么。这里有点懵懂 👍🏽0 💭N/A IP 🕐2020-05-30 22:20:13
│ └── 大概是条废咸鱼: 不是一个概念,比特流你理解的没问题,字节流是种类比,同时也表示IO流框架中最基本的底层流 👍🏽0 💭N/A IP 🕐2020-05-30 23:29:06
竹风有点甜: 写得很好[赞同]又学习了一遍,加深印象 👍🏽0 💭N/A IP 🕐2020-05-30 17:09:37
默烦: 收藏了收藏了[调皮] 👍🏽0 💭N/A IP 🕐2020-05-30 16:30:25
闷近妖: 这么好的回答,为什么要匿名?[好奇] 👍🏽0 💭N/A IP 🕐2020-05-30 12:52:04
知乎用户r3z2XB: 说了半天就是说java io的确很复杂。其他那个语言的io这么复杂? 👍🏽0 💭N/A IP 🕐2020-05-30 12:14:14
雪痕心迹: 谢谢大佬,学到了 👍🏽0 💭N/A IP 🕐2020-05-30 08:53:26
你是个儿吗: 🐂比 👍🏽0 💭N/A IP 🕐2020-05-30 03:21:43
桃桃居: 还没看完 但是我觉得你写的很好,很通俗易懂,能在分享点其他的吗,我最近都在准备面试正好看看 👍🏽0 💭N/A IP 🕐2020-05-29 22:21:05
│ └── 大概是条废咸鱼: 没了,我也不是专业写文章的,匿名就是希望大家不要对我抱有什么期望,找我追更啥的!将来或许还会写一篇NIO,到此为止了。写IO的原因也是由于自己觉得这块知识可能对初学者不太友好,至少当初我在学习的时候,傻傻分不清了好久。[害羞] 👍🏽2 💭N/A IP 🕐2020-05-29 22:58:25
林清风: 低调的大佬[飙泪笑][飙泪笑] 👍🏽0 💭N/A IP 🕐2020-05-29 20:55:29
momo: 想关注一波结果匿名了[捂嘴] 👍🏽0 💭N/A IP 🕐2020-05-29 19:49:13
我家猫: 已收藏,期待楼主更新 👍🏽0 💭N/A IP 🕐2020-05-29 11:11:30
风中的劲草: 取消匿名吧,我要关注你 👍🏽0 💭N/A IP 🕐2020-05-29 10:54:31
知乎用户vdM8jL: 安装设计时的逻辑讲,说的很棒了.有软工的味道 👍🏽0 💭N/A IP 🕐2020-05-29 10:09:53
无敌风火轮胎: 我清晰了,赞👍🏻i 了 👍🏽0 💭N/A IP 🕐2020-05-29 08:32:46
Blue: 写的真好 👍🏽0 💭N/A IP 🕐2020-05-29 08:27:49
斯巴达: 原来 reader 和 writer 是这个意思 👍🏽0 💭N/A IP 🕐2020-05-29 00:47:28
还能抢救一下: 大佬,最近刚好用到io流,如果有时间的话延伸一下吧,多讲讲[惊喜] 👍🏽0 💭N/A IP 🕐2020-05-28 23:27:37
护花铃: 写的真好,醍醐灌顶,以前看着一堆io流死活记不住,用的时候百度 👍🏽0 💭N/A IP 🕐2020-05-28 22:16:28
打不shi的流云: 太赞了,言简意赅! 👍🏽0 💭N/A IP 🕐2020-05-28 22:08:23
Real.skins: 不要匿名啊 让我关注你老哥[可怜][可怜] 👍🏽0 💭N/A IP 🕐2020-05-28 21:53:51
xxxxxx: 大佬能继续讲讲网络流吗 👍🏽0 💭N/A IP 🕐2020-05-28 20:29:09
EMINEM: 因为io设计的时候不合理,才出现了那么多不同io类 👍🏽0 💭N/A IP 🕐2020-05-28 20:07:38
前路难走有你有狗: 教练,好复杂,你用过c井没有 👍🏽0 💭N/A IP 🕐2020-05-28 17:22:36
浩神: 醍醐灌顶 👍🏽0 💭N/A IP 🕐2020-05-28 16:43:50
Sharlock Holmes: 答主 我对输入输出很有兴趣 把IO流作为职业的发展方向有前途吗?有什么领域的职位? 我担心我一个java开发 java面向对象 C才是面向过程 是不是C倾向于输入输出? 👍🏽0 💭N/A IP 🕐2020-05-28 14:42:46
│ └── Kymo: 没见过io岗位 👍🏽0 💭N/A IP 🕐2020-05-30 14:17:20
│ │ └── Sharlock Holmes: IO流不能当职业发展方向呢 我买了本MICK的sql进阶教程 也不知道该怎么努力 先看完这个 👍🏽0 💭N/A IP 🕐2020-05-30 21:19:50
│ └── weightwei: 兄弟平常开发哪有只让你做io的,基本框架逻辑起码得会写吧 👍🏽0 💭N/A IP 🕐2020-05-31 21:51:55
包文东: 能讲的这么好 对这方面的知识一定很深刻了 👍🏽0 💭N/A IP 🕐2020-05-28 13:17:13
Quentin: 蜜汁评论 👍🏽0 💭N/A IP 🕐2020-05-28 12:46:06
偏执: 感谢 👍🏽0 💭N/A IP 🕐2020-05-28 12:39:44
韩经哲: 我也要关注 👍🏽0 💭N/A IP 🕐2020-05-28 11:44:20
GGAIYY: 大佬深入浅出下NIO 👍🏽0 💭N/A IP 🕐2020-05-28 11:39:21
│ └── 大概是条废咸鱼: NIO我自己还没研究透呢,等研究透了再来放个链接[欢呼] 👍🏽0 💭N/A IP 🕐2020-05-28 13:08:10