已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
昨天关门了。
Improve this question
对编码和Java来说非常陌生,我正试图将我的头围绕在流上。
我的教科书上说“Java I/O系统将流链接到物理设备。”当他们说“物理”时,他们是什么意思?我还看到这个词被用来描述 * 代码 *,而不是人们可以看到和触摸到的实际物理事物。
当他们说一个流链接到一个物理设备时,他们是指一个你可以保存的实际东西,还是存在于内存中的东西,比如一个对象?谷歌在这方面没有给我太多帮助,说“一个流链接到一个物理层”,我也不确定这是什么意思。
2条答案
按热度按时间f45qwnt81#
你的书可能已经过时了。
Java使用
java.io.InputStream
接口已经有30年了,这就是它所指的,但并不正确。Java也有
java.util.stream.Stream
流,它是 * 完全不相关的 *,也使用这个词。InputStream
InputStream是一个抽象的概念,表示一个 * 可读的字节流 *。通过设计,这个流不(必须)保存在内存中。例如,你可以把一个文件变成这样的东西,如果这个文件绝对巨大也没关系。你可以简单地检查javadoc of
InputStream
以了解更多。既然它是一个接口,如果你愿意,你可以实现一个。Java有许多接口被烘焙到核心库中,还有数百个常用的第三方库。
它们通常用于文件,网络连接和数据库blob。无论你是否觉得这是“物理”......现在我们只是在咬文嚼字,我不确定它是否有用。重点是,你正在阅读的教程/文档决定通过使用这个术语来澄清问题,我认为这是一个非常糟糕的主意。它澄清的很少。事实上,它本质上是废话-根本不需要由物理设备支持输入流。
瞧。我做了一个输入流,它绝对没有任何物理支持。或者,如果“好吧,那个数组在RAM中,所以我猜那是计数”是思路,那么String也是由“物理的东西”支持的,事实上java中的所有东西都是。无论哪种方式,这种说法要么是不正确的,要么是高度误导。
然而,InputStream被设计为处理“物理”概念。
例如,无论我们谈论的是旋转盘片还是SSD中的单元,它们都无法提供单个字节,而是给予整个块的价值。
因此,InputStream的API有点奇怪-你可以要求它输入1个字节,或者,你可以提供一个字节数组,并要求它填充它“只要输入流感觉有效”。例如,给定一个剩下1GB数据的文件,如果你交给它一个100 MB字节数组,API可以自由填充20 MB,告诉你它给了你20 MB,然后返回。即使它可以多填充80 MB。
因为这可能是“最有效的”--它取决于硬件,而
InputStream
的全部意义在于它将这些东西抽象出来。书/教程/谷歌搜索结果犯了一个非常常见的解释性错误,那就是他们有一个词,他们认为每个人都认为这个词的意思是作者认为它的意思,然后只是使用这个词而不解释它。
没有这样的运气-许多单词要么是直接的模糊(因为有整个文化战争争夺它的含义),或者只在“行话是明确的”的意义上是明确的-如果你知道Java行话中的“流”是什么,那么你……知道流是什么。无论哪种方式,当你试图解释基础知识的时候,假设读者知道术语,这当然是非常愚蠢的,但听起来你的教程或其他东西没有犯这个错误。也许最好把它扔掉,或者至少记住它做得不是很好。
无论如何,作者认为“身体”这个词的意思是:
这并不清楚,但即使我们将其视为read,它也是错误的,因为您也可以为像字节数组这样简单的东西创建InputStream。
java.util.stream.Stream
sense这是对集合概念的不同“理解”,例如列表。它与文件和网络完全无关,是一个类似的 * 高度 * 抽象的概念。
InputStream
是字节流,出于效率原因,API公开了各种批量抓取它们的方法。j.u.s.Stream
是T流-如在,选择一个类型,它可以是字符串,字节,人、学生、马、计算机、视频、消息、歌曲或任何你想要的东西。它没有“为了效率”而使用的批量方法,它有用于可读性的批量方法。除了英语词典中的单词“stream”感觉很适合这两个词之外,两者之间 * 绝对没有任何关系 *。进一步强调一个明确的结论:你正在阅读的教程/书是想澄清一些事情。它错过了标记。由相当多的棒球场。
lmyy7pcs2#
当它提到“物理层”时,它只是说Stream在某个地方到达了你实际上可以触摸到的东西(即物理)。
对大多数人来说,文件只是存储在计算机上的东西,被认为是数字的。但是当你在Java中使用
FileInputStream
时,它会在某个地方到达你的物理存储设备(硬盘驱动器,固态驱动器等),在那里实际存储输入。