尝试理解Java I/O和流



这是编码和Java的新手,我正试图了解流。

我的课本上说"流通过Java I/O系统链接到物理设备"当他们说";物理";?我还看到了一个用来描述代码的词,而不是一个可以看到和触摸的实际物理物体。

当他们说流链接到物理设备时,他们是指你可以持有的实际东西,还是指内存中存在的东西,比如物体?谷歌在这方面帮不了我多少忙,说了一些类似";流链接到物理层";,我也不知道这意味着什么。

你的书可能已经过时了。

Java拥有java.io.InputStream接口已有大约30年的历史。这就是它所指的,但这是不正确的。

Java还有java.util.stream.Stream流,该流与完全无关,并且也使用该词。

InputStream

InputStream是一个抽象概念,表示可读的字节流。根据设计,这个流不一定保存在内存中。例如,你可以把一个文件变成这样的东西,如果这个文件绝对巨大也没关系。您可以简单地查看InputStream的javadoc以了解更多信息。

假设它是一个接口,如果您愿意,可以实现一个接口。Java的核心库中包含了许多这样的库,还有数百个常用的第三方库。

它们通常用于文件、网络连接和数据库Blob。无论你觉得这是"身体上的"。。现在我们只是含糊其辞,我不确定它是否有用。重点是,你正在阅读的教程/文件决定使用这个术语来澄清问题,我认为这是一个非常糟糕的主意。它澄清得很少。事实上,这本质上是一种浪费——根本不需要物理设备来支持输入流。此处:

byte[] data = new byte[] {1, 2, 3, 4};
InputStream in = new ByteArrayInputStream(data);

沃伊拉。我制作了一个输入流,它绝对没有任何物理支持。或者,如果"好吧,那个数组在RAM中,所以我想计数"是思路,那么字符串也有"物理的东西"支持,事实上java中的所有东西都是。无论哪种方式,这个语句要么不正确,要么极具误导性。

尽管如此,InputStream是为处理"物理式"概念而设计的。

例如,无论我们谈论的是旋转盘片还是SSD中的单元,它们从根本上都无法给你一个字节。相反,他们会给你整个街区的价值。

因此,InputStream的API有点奇怪——你可以要求它提供1个字节,或者,你可以向它提供一个字节数组,并要求它"在输入流认为有效的情况下"填充它。例如,给定一个剩余1GB数据要读取的文件,如果你交给它一个100MB字节的数组,API可以自由填充20MB,告诉你它给了你20MB,然后返回。尽管它可以再填充80 MB。

因为这可能是"最有效的"——这取决于硬件,而InputStream要点是它将这些东西抽象掉。

这本书/教程/谷歌的结果是一个非常常见的解释错误,那就是他们有一个词,他们认为每个人都认为这个词的意思是作者认为的意思,然后只是使用这个词而没有解释它。

没有这样的运气-许多单词要么直接模棱两可(因为有整个文化战争在争夺它的含义),要么只是在"行话很清楚"的意义上才清楚-如果你知道java行话中的"流"是什么,那么你。。。知道什么是流。无论哪种方式,当你试图解释基础知识时,假设读者知道术语,这当然是说教式的说法,完全是愚蠢的。然而,这听起来像是你的教程或什么没有犯那个错误。也许最好把它扔掉,或者至少要记住它做得不太好。

无论如何,作者认为"物理"一词的含义是:

  • 磁盘/ssd上的文件
  • 数据库中的blob
  • TCP/IP网络连接的一侧(从与您交谈的任何人到您的应用程序的数据流。例如,如果请求网页,HTTP会返回标头,例如HTML)

这还不清楚,但即使我们将其视为读取,也有错误,因为您也可以为字节数组这样简单的东西生成InputStream。

java.util.stream.Stream意义

这是对集合(如列表)概念的不同"理解"。它与文件和网络完全无关,是一个类似的高度抽象的想法。InputStream是一个字节流,出于效率的原因,API公开了大量获取它们的各种方法。j.u.s.Stream是一个Ts流——就像在pick a type中一样,它可以是字符串、字节、人、学生、马、计算机、视频、消息、歌曲或任何你想要的东西的流。它没有批量方法"为了效率";,为了可读性,它有批量方法。除了英语词典中的单词"stream"感觉很适合他们两个之外,这两个词之间绝对没有任何关系。

进一步强调一个明确的结论:你正在阅读的教程/书籍试图澄清事情。它没有击中目标。有好几个棒球场。

当它指的是一个"物理层";,它只是说,在这条线的某个地方,流到达了你可以真正触摸到的东西(即物理的)。以FileInputStream为例。

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

最新更新