提问人:zafflesia 提问时间:4/2/2023 最后编辑:Anonymouszafflesia 更新时间:4/2/2023 访问量:124
尝试理解 Java I/O 和流 [已结束]
Trying to understand Java I/O and streams [closed]
问:
对编码和 Java 非常陌生,我正试图将我的头脑包裹在流上。
我的教科书上说:“流通过 Java I/O 系统链接到物理设备。当他们说“物理”时,他们是什么意思?我还看到这个词用来描述代码,而不是人们可以看到和触摸的实际物理事物。
当他们说流链接到物理设备时,他们指的是你可以持有的实际东西,还是内存中存在的东西,比如一个对象?谷歌在这方面并没有帮我太多,比如说“流链接到物理层”,我也不确定这意味着什么。
答:
当它提到“物理层”时,它只是说流到达了你可以实际触摸的东西(即物理层)。以 ,为例。FileInputStream
对于大多数人来说,文件只是存储在他们计算机上的东西,被认为是数字的。但是当你在 Java 中使用时,它会到达你的物理存储设备(硬盘驱动器、固态驱动器等),实际存储输入的地方。FileInputStream
评论
你的书可能已经过时了。
Java 已经有大约 30 年的界面了。这就是它所指的,但不正确。java.io.InputStream
Java 也有完全不相关的流,并且也使用该词。java.util.stream.Stream
输入流
InputStream 是一个抽象概念,表示可读的字节流。根据设计,此流(不一定)保留在内存中。例如,你可以把一个文件变成这样的东西,如果这个文件绝对是巨大的,这并不重要。您可以简单地查看 InputStream
的 javadoc 了解更多信息。
鉴于它是一个接口,您可以根据需要实现一个接口。Java 在核心库中融入了其中的许多内容,在常用的第三方库中还有数百个。
它们通常用于文件、网络连接和数据库 Blob。你是否觉得那是“身体上的”......现在我们只是剁碎的话,我不确定它是否有用。关键是,您正在阅读的教程/文档决定使用该术语来澄清问题,我认为这是一个非常糟糕的主意。它澄清的很少。事实上,它本质上是胡说八道——根本不需要物理设备支持输入流。这里:
byte[] data = new byte[] {1, 2, 3, 4};
InputStream in = new ByteArrayInputStream(data);
瞧。我制作了一个绝对没有任何物理支持的输入流。或者,如果“好吧,那个数组在RAM中,所以我想这很重要”是思路,那么String也由“物理的东西”支持,事实上java中的所有东西都是。无论哪种方式,这种说法要么是不正确的,要么是高度误导的。
尽管如此,InputStream 旨在处理“物理”概念。
例如,无论我们谈论的是旋转盘片还是 SSD 中的单元,它们从根本上都无法为您提供单个字节。相反,他们给你整个块的价值。
因此,InputStream 的 API 有点奇怪 - 您可以要求它提供 1 个字节,或者,您可以为它提供一个字节数组并要求它“只要输入流认为有效”就填充它。例如,给定一个有 1GB 数据可供读取的文件,如果您给它一个 100MB 字节数组,API 可以自由填充 20MB 值,告诉您它给了您 20MB,然后返回。即使它可以再填满 80 MB。
因为也许这是“最有效的”——这取决于硬件,而重点是它把这些东西抽象出来。InputStream
这本书/教程/谷歌结果犯了一个非常常见的解释错误,那就是他们有一个词,他们认为每个人都认为这个词的意思与作者认为的意思相同,然后只是使用这个词而不解释它。
没有这样的运气 - 许多词要么是模棱两可的(因为整个文化战争都在争论它的含义),要么只是在“行话很清楚”的意义上才清楚——如果你知道 java 行话中的“流”是什么,那么你......知道什么是流。无论哪种方式,当你试图解释基础知识时,假设读者知道行话,这当然是完全愚蠢的。然而,这听起来像是你的教程,或者什么没有犯这个错误。可能最好把它扔掉,或者至少记住它做得不是很好。
无论如何,作者认为“物理”一词的意思是:
- 磁盘/固态硬盘上的文件。
- 数据库中的 Blob。
- TCP/IP 网络连接的一端(“从您与之交谈的任何人流向您的应用程序的数据。例如,如果请求网页,则 HTTP 返回标头,例如 HTML)。
这还不清楚,但即使我们将其视为读取,也是错误的,因为您也可以为像字节数组这样简单的东西制作 InputStream。
感觉java.util.stream.Stream
这是对集合(例如列表)概念的不同“看法”。它与文件和网络完全无关,是一个类似的高度抽象的概念。 是一个字节流,出于效率原因,API 公开了各种批量抓取它们的方法。 是 T 的流 - 例如,选择一种类型,它可以是字符串、字节、人物、学生、马、计算机、视频、消息、歌曲或任何你想要的流。它没有“提高效率”的批量方法,它有用于可读性的批量方法。除了英语词典中的单词“stream”感觉很适合这两个词之外,两者之间绝对没有任何关系。InputStream
j.u.s.Stream
进一步强调一个明确的结论:您正在阅读的教程/书籍试图澄清事情。它没有达到目标。通过相当多的球场。
评论
java.util.stream.Stream
评论
java.util.stream
InputStream
OutputStream
InputStream
byte[]