尝试理解 Java I/O 和流 [已结束]

Trying to understand Java I/O and streams [closed]

提问人:zafflesia 提问时间:4/2/2023 最后编辑:Anonymouszafflesia 更新时间:4/2/2023 访问量:124

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

8个月前关闭。

对编码和 Java 非常陌生,我正试图将我的头脑包裹在流上。

我的教科书上说:“流通过 Java I/O 系统链接到物理设备。当他们说“物理”时,他们是什么意思?我还看到这个词用来描述代码,而不是人们可以看到和触摸的实际物理事物。

当他们说流链接到物理设备时,他们指的是你可以持有的实际东西,还是内存中存在的东西,比如一个对象?谷歌在这方面并没有帮我太多,比如说“流链接到物理层”,我也不确定这意味着什么。

Java IO 输入 输出流

评论

3赞 tgdavies 4/2/2023
程序的每个方面最终都“链接到物理设备”,无论是内存、磁盘驱动器还是其他东西。关于 Streams 的重要一点是理解抽象以及如何使用它。我不认为专注于那个模糊的句子是有用的。
0赞 tgdavies 4/2/2023
(不要混淆 和 和 ,这可能是你的教科书所指的!java.util.streamInputStreamOutputStream
0赞 tgdavies 4/2/2023
当然,an也可以链接到a--这是否是一个“物理设备”尚不清楚。InputStreambyte[]
1赞 tgdavies 4/2/2023
@OleV.V.文件也是如此。还有一个 TCP/IP 套接字。
1赞 Anonymous 4/2/2023
@tgdavies 非常正确。你的第一条评论是切中要害的。在一些编程概念和下面的金属之间可以有几层,甚至很多层的抽象。(这里说“下面”也是一种抽象。

答:

1赞 darkshadowtrail 4/2/2023 #1

当它提到“物理层”时,它只是说流到达了你可以实际触摸的东西(即物理层)。以 ,为例。FileInputStream

对于大多数人来说,文件只是存储在他们计算机上的东西,被认为是数字的。但是当你在 Java 中使用时,它会到达你的物理存储设备(硬盘驱动器、固态驱动器等),实际存储输入的地方。FileInputStream

评论

1赞 Turing85 4/2/2023
你的解释引出了一个问题:你能说出编程中发生的事情吗,它没有达到“物理层”?请参阅 tgdavies 的评论
1赞 rzwitserloot 4/2/2023 #2

你的书可能已经过时了。

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”感觉很适合这两个词之外,两者之间绝对没有任何关系InputStreamj.u.s.Stream

进一步强调一个明确的结论:您正在阅读的教程/书籍试图澄清事情。它没有达到目标。通过相当多的球场。

评论

0赞 zafflesia 4/3/2023
我希望我的教科书没有过时,它是 2022 年版......如果事情更新得那么快,那我就真的有麻烦了!我看到“物理”这个词引起了很多麻烦。与我交谈过的一些人以前甚至没有听说过这个意义上的术语。但是谢谢你!我遇到了很多我不熟悉任何行话的墙,然后我必须转过身来找出所有这些含义,然后才能理解原始概念。
0赞 rzwitserloot 4/3/2023
这在教学上充其量是“次优”的。“蹩脚的写作”可能是一个更公平的名字。我认为这是“我们已经在 2022 年更新了它”,他们错误地认为现在存在的措辞不需要更新。请注意,有“俚语行话”,这是一个艺术术语,有些人强烈认为这意味着 X,但其他人则不然。这仍然是行话,因为 X 是段落+,所以你需要一些词来形容它。还有“官方术语”,实际上每个人都同意确切的含义。java.util.stream.Stream
0赞 rzwitserloot 4/3/2023
"Official jargon" generally gets its blessings because thats the term used in official specs and docs, such as 'method' being official jargon. Point is 'physical' here is straight up incorrect (it's conflating what InputStreams are usually used for and what their spec requires), but insofar that it is trying to be helpful, it's slang jargon. Best not to dwell on slang jargon. Communication is the job of transferring thought from one brain to another. If the word/paper/voice/speakers/screen aren't doing a good job at this, ditch the tool, don't fight about it.
0赞 zafflesia 4/3/2023
Understood! Thank you so much. I'll keep that in mind as I keep studying!