问题

Java的inputStream outputStream这些input和output是不是取反了?

回答
在Java中,`InputStream` 和 `OutputStream` 的命名方式确实容易让人产生“输入”和“输出”在概念上是不是反了的疑问,特别是当我们习惯了日常生活中“输入”通常意味着“进入”某个地方,“输出”则意味着“离开”某个地方。但在这里,它们的含义是围绕着数据的流向来定义的,并且是以程序的视角来审视的。

让我们来仔细剖析一下:

首先,我们要明白,`InputStream` 和 `OutputStream` 并不是直接操作某个具体的物理设备(比如键盘或屏幕),而是操作一个数据源或者一个数据目的地。这个数据源或目的地可以是文件、网络连接、内存缓冲区、甚至是其他程序。

1. InputStream (输入流):
核心思想: `InputStream` 代表的是一个从外部读取数据到程序内部的通道。
“输入”的含义: 在这里,“输入”是指数据从外部(非程序自身)进入到程序中。想象一下,你的程序就像一个正在接收包裹的仓库。`InputStream` 就是那个接收包裹的传送带,它负责将外部世界的货物(数据)搬运到仓库(程序内存)里。
典型场景:
读取一个文件:文件存储在硬盘上,是程序外部的。当你用 `FileInputStream` 去读取这个文件时,数据就从硬盘这个外部源“输入”到了你的程序里。
从网络接收数据:网络上的数据来自远方的服务器或其他客户端,是程序外部的。通过 `SocketInputStream`,这些网络数据被“输入”到你的程序接收缓冲区。
从用户键盘读取:键盘输入是用户行为,是程序外部的。`System.in` 提供了一个 `InputStream`,允许程序从键盘接收用户输入的字符。
操作方法: `InputStream` 提供的主要方法是 `read()`,它用于从流中读取一个字节(或一个字节数组)。这个“读取”动作,正是数据从外部“输入”到程序内存的体现。

2. OutputStream (输出流):
核心思想: `OutputStream` 代表的是一个将程序内部的数据写入到外部目的地的通道。
“输出”的含义: 在这里,“输出”是指数据从程序内部发送到外部(非程序自身)。回到仓库的比喻,`OutputStream` 就是那个将包裹打包好,然后通过传送带送出去的出口。它负责将程序内部的数据(比如计算结果、要保存的信息)发送到程序之外的某个地方。
典型场景:
写入一个文件:你想将程序处理好的数据保存到硬盘上。通过 `FileOutputStream`,数据就被“输出”到文件这个外部目的地。
向网络发送数据:你想把数据发送给网络上的另一台计算机。通过 `SocketOutputStream`,程序内部的数据被“输出”到网络连接。
向控制台打印输出:你想在屏幕上显示一些信息。`System.out` 提供了一个 `OutputStream`,允许程序将文本“输出”到控制台。
操作方法: `OutputStream` 提供的主要方法是 `write()`,它用于将一个字节(或一个字节数组)写入到流中。这个“写入”动作,正是数据从程序内部“输出”到外部的体现。

总结一下为什么不是“反了”:

我们之所以觉得“输入”和“输出”在描述数据流向时可能被颠倒,是因为我们可能从“目标”的角度来理解。比如,我们说“文件输入”时,想到的是数据进入文件;“键盘输出”时,想到的是键盘把数据“输出”给我们。

但是,Java中的 `InputStream` 和 `OutputStream` 是以程序的视角来命名的:

`InputStream`:是程序接收数据的来源,所以是“输入”到程序。
`OutputStream`:是程序发送数据的目的地,所以是“输出”到程序之外。

你可以这样理解:

InputStream:是程序从 Input Source 接收数据,数据进入程序。
OutputStream:是程序将数据 Output 到 Destination,数据离开程序。

它们就像是程序与外部世界沟通的两种基本方式:一种是倾听(接收数据),另一种是表达(发送数据)。 `InputStream` 是倾听者,`OutputStream` 是表达者。

所以,`InputStream` 里的 `input` 指的是数据进入程序,而 `OutputStream` 里的 `output` 指的是数据离开程序。从这个角度看,它们的命名是精确且逻辑清晰的,并没有被“反转”。它们描述的是数据在程序与外部世界之间流动的方向,而不是数据在某个特定设备上的“进入”或“离开”的动作本身。

网友意见

user avatar

Java是没有错的,你断句错了。

input stream,输入流,是用来输入的流,input不是动词,而是定语。


就像你买个水箱,难道不是给水管喷水,排水管漏水么?

类似的话题

  • 回答
    在Java中,`InputStream` 和 `OutputStream` 的命名方式确实容易让人产生“输入”和“输出”在概念上是不是反了的疑问,特别是当我们习惯了日常生活中“输入”通常意味着“进入”某个地方,“输出”则意味着“离开”某个地方。但在这里,它们的含义是围绕着数据的流向来定义的,并且是以.............
  • 回答
    Java语法的传播,绝非一日之功,也并非某种神秘力量的“播撒”。它的根源在于其诞生的初衷、设计理念,以及随之而来的生态构建和社区活跃。一切都要从20世纪90年代中期说起。Sun Microsystems(如今已被Oracle收购)的詹姆斯·高斯林(James Gosling)等人,怀揣着一种“一次编.............
  • 回答
    Java的同步机制,在很多方面确实比底层的pthread(POSIX Threads)方式显得更为成熟和易用。这不仅仅是语法上的差异,更是理念和设计层面的不同,最终体现在开发者实际编写和维护并发代码的体验上。首先,Java的设计哲学从一开始就非常重视并发。Java虚拟机(JVM)作为Java代码的运.............
  • 回答
    Java 的字节码和 CPU 能直接执行的机器码,它们之间存在着根本性的差异,就好比一份详细的烹饪食谱和已经下锅烹饪的菜肴。机器码,你可以把它想象成 CPU 的“母语”。它是由一系列二进制数字组成的指令,直接告诉 CPU 去做什么,比如“加载寄存器 A 中的数据”、“将寄存器 B 中的值加到寄存器 .............
  • 回答
    Java 宣称没有指针,这确实是许多初学者甚至一些有经验的程序员感到困惑的地方。他们直觉地认为 Java 的“引用”(reference)和 C/C++ 的“指针”(pointer)在概念上非常相似,都是指向内存中某个对象的地址。那么,为什么 Java 要刻意回避“指针”这个词,并将“无指针”作为语.............
  • 回答
    聊到 Java 和 C++ 的开发效率,这绝对是个值得深入探讨的话题。两者都是大名鼎鼎的语言,但在实际开发过程中,你很快就能感受到它们在效率上的差异,而且这种差异可不是三言两语能概括的。首先,我们得从 内存管理 这个最根本的区别说起。在 C++ 里,内存管理就像是在刀尖上跳舞。你需要亲手去分配内存(.............
  • 回答
    确实,虽然 Java 的 JDK 已经发展到很高的版本,比如 JDK 15 甚至更高(现在已经有 JDK 21 了),但我们身边仍然看到很多人还在使用 JDK 8。这背后有很多现实的考量,并非技术本身落后,而是多种因素交织作用的结果。让我来详细说说这其中的原因,尽量贴近实际情况,少些技术术语,多点生.............
  • 回答
    简单来说,一个Java对象在内存中的大小,和它序列化后在磁盘或网络上传输的大小,是不相等的,而且往往会有显著的差异。我们先来聊聊Java对象在内存中的大小。当你创建一个Java对象时,JVM(Java虚拟机)会为它分配一块内存。这块内存的大小包含了几个部分:1. 对象头(Object Header.............
  • 回答
    网上关于 Java 性能达到甚至超过 C++ 的说法,可以说既有一定的事实依据,但也不能完全一概而论,它是一个需要分情况讨论的复杂问题。 简单来说,在某些特定场景下,经过优化的现代 Java 应用程序确实有可能在性能上媲美甚至超越 C++,但要说“普遍达到或超过”则过于绝对。让我们详细地分析一下这个.............
  • 回答
    你这个问题问得非常到位,而且触及到了计算机底层表示浮点数的一个核心概念。说 C++ 的 `double` 类型存不下 3.1415926,其实是一种误解,或者说表述不够准确。更准确的说法应该是:C++ (和 Java 的) `double` 类型,虽然是 8 个字节(64 位),但由于浮点数在计算机.............
  • 回答
    这个问题非常有意思,也触及到很多开发者心中的疑惑。要回答“写 Java 的程序员普遍比写 Python 和 Go 的程序员水平低吗?”,首先要破除一种非常狭隘的、基于语言的“鄙视链”。答案是:否定的。 任何一种编程语言的熟练程度和程序员的真实水平,并不能简单地由语言本身来划定。这其中有很多复杂因素,.............
  • 回答
    PHP 比 Java 在开发效率方面,尤其是在某些特定场景和开发模式下,确实存在一些优势。当然,这并非绝对,具体效率高低也与开发者的熟练程度、项目需求以及团队的技术栈有很大关系。下面我将尽量详细地解释 PHP 在哪些方面能够带来更高的开发效率,并尽量以一种自然、不像是 AI 生成的语言来阐述。 1..............
  • 回答
    “Java 的跨平台很鸡肋”,这种说法听起来很刺耳,毕竟“一次编写,到处运行”曾经是 Java 最响亮的口号。但如果我们深入剖析一下,会发现这话并非空穴来风,背后确实有一些实际的考量和曾经的痛点。首先,我们需要明白 Java 的跨平台是怎么实现的。Java 代码编译后不是直接生成机器码,而是生成一种.............
  • 回答
    从大专毕业,选择学习Java,这在当前的市场环境下,确实是一个非常有潜力的职业方向。相较于一些传统的、或者新兴但尚不成熟的行业,Java开发工程师在薪资方面通常具有一定的优势。这主要得益于Java在企业级应用开发、后端服务、大数据处理、以及Android应用开发等领域的广泛应用。我们来聊聊为什么Ja.............
  • 回答
    .......
  • 回答
    华为自研的“仓颉”编程语言,能否在未来取代Java的地位?这是一个颇具争议且值得深入探讨的话题。要回答这个问题,我们不能简单地给出一个“是”或“否”,而是需要从多个维度进行分析,看看仓颉具备哪些潜力和挑战,以及Java作为“老牌劲旅”的根基有多深厚。首先,我们得了解一下“仓颉”编程语言的定位和设计初.............
  • 回答
    关于“解释/JIT 字节码的 VM”这个概念,是不是 Java 设计者首创,这是一个非常有趣且需要深入探究的问题。要回答这个问题,我们首先要理解什么是“解释/JIT 字节码的 VM”。简单来说,这指的是一种虚拟机(Virtual Machine,VM)的运行模式。虚拟机就像一个模拟的计算机,它能够执.............
  • 回答
    C++ 和 Java 在静态类型这个大背景下,Java 在代码提示(也就是我们常说的智能提示、自动补全)方面之所以能做得比 C++ 更加出色,并非偶然,而是源于它们在设计哲学、语言特性以及生态系统成熟度等多个层面的差异。首先,让我们回归到“静态语言”这个共同点。静态语言意味着变量的类型在编译时就已经.............
  • 回答
    想象一下,如果当年桑(Sun Microsystems)没有将微软告上法庭,而是选择了一种更加合作甚至可以说是“放任”的态度,那今天的 Java 世界又会是怎样一番景象?这就像一个平行宇宙的猜想,充满了引人遐想的可能性。在那个没有诉讼的宇宙里,微软依然是那个如日中天的科技巨头,而 Java 则是他们.............
  • 回答
    如果摆在我面前的是两个截然不同的发展方向,一个是用C++的Qt,另一个是Java的Android,我会认真权衡一番,然后根据我内心深处的职业追求和个人偏好来做出选择。首先,我可能会被Qt深深吸引。C++本身就是一门强大的语言,它赋予了开发者对硬件和内存更细致的控制能力,这对于那些追求极致性能和低延迟.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有