您能解释一下流的概念吗?

2024-04-18

我知道流是字节序列的表示。每个流都提供了向其给定的后备存储读取和写入字节的方法。但流的意义何在?为什么我们与之交互的不是后备存储本身?

不管出于什么原因,这个概念并不适合我。我读过很多文章,但我想我需要一个类比或其他东西。


选择“流”这个词是因为它(在现实生活中)代表的含义与我们使用它时想要传达的含义非常相似。

让我们暂时忘记后备存储,并开始考虑与水流的类比。您会收到连续的数据流,就像河中的水不断流动一样。您不一定知道数据来自哪里,而且大多数情况下您也不需要知道;无论是来自文件、套接字还是任何其他来源,这并不(不应该)真正重要。这与接收一股水流非常相似,您不需要知道它来自哪里;您只需知道它是从哪里来的。无论是来自湖泊、喷泉还是任何其他来源,这并不(不应该)真正重要。

也就是说,一旦您开始认为您只关心获取所需的数据,无论数据来自何处,其他人谈论的抽象就会变得更加清晰。您开始认为您可以包装流,并且您的方法仍然可以完美工作。例如,您可以这样做:

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);

如您所见,更改输入源变得非常容易,而无需更改处理逻辑。例如,要从网络套接字而不是文件读取数据:

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);

尽可能简单。美丽还在继续,因为您可以使用任何类型的输入源,只要您可以为其构建一个流“包装器”。你甚至可以这样做:

public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());

看?只要您的方法不关心输入源是什么,您就可以通过各种方式自定义源。这种抽象允许您以一种非常优雅的方式将输入与处理逻辑解耦。

请注意,我们自己创建的流没有后备存储,但它仍然可以完美地满足我们的目的。

因此,总而言之,流只是一个输入源,隐藏(抽象)另一个源。只要不破坏抽象,你的代码就会非常灵活。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您能解释一下流的概念吗? 的相关文章

  • WinForms 应用程序中的初始化代码 - Program.cs 还是 MainForm?

    我有一个 Windows 窗体应用程序 当前在启动时加载数据库 流程是这样的 Program cs gt Application Run new MainForm gt MainForm 构造函数 gt 打开数据库 因此基本上 MainFo
  • Java中如何让另一个线程休眠

    我有一个扩展 Thread 的类 这个线程在运行时大部分时间都在睡眠 它会执行一个检查 如果 true 执行一个简单的操作 然后睡眠 1 2 秒并重复 该类还有一个由其他线程调用的公共方法 如果调用此函数 我希望线程在已经休眠的情况下休眠更
  • 如何在 Spring Boot WebMvcTest 中设置上下文路径

    我正在尝试从 Spring Boot 应用程序测试我的 Rest 控制器 并希望控制器在与生产中相同的路径下可用 例如我有以下控制器 RestController Transactional public class MyControlle
  • 使用反射检查java中的字段是否为final

    我正在编写一个类 它在某些时候必须拥有它的所有内容Fields 从该类的另一个项目分配 我通过反思做到了 for Field f pg getClass getDeclaredFields f set this f get pg 问题是 这
  • 您会在新的商业项目中使用 S#arp 架构吗?

    The S arp 架构 http code google com p sharp architecture 看起来真的很酷 但是您是否认为它仍然太新而无法在重要的新项目中做出承诺 我们假设该项目乍一看很适合它 It all seems非常
  • 桌面 webkit 相当于 Android 的 addJavascriptInterface()?

    在研究 Android UI 可能性时 我发现了一种名为 addJavascriptInterface 的方法的文档 该方法允许您将 Android Java 对象上的方法公开给 UI 的 WebView 组件中的 Javascript 这
  • XMLEncoder 和 XStream 的相对优势是什么?

    假设我想用XML存储许多小的配置对象 并且我不太关心格式 这XML解码器 http java sun com j2se 1 5 0 docs api java beans XMLDecoder htmlJDK 中内置的类可以工作 据我所知
  • 从 JVM 线程本地空间卸载 Clojure 变量

    我正在 Clojure 中为 BaseX 编写一个插件 通过 lein uberjar 构建 并包含 Clojure 解释器 在大多数情况下 这效果很好 然而 当通过 BaseX HTTP 实例运行时 评估在 Jetty 的线程池内进行 而
  • 自 2012 年 6 月升级 SDK 1.7 以来,Azure 部署不断回收

    我有一个之前运行成功的部署 从那时起 我已升级到 2012 年 6 月的 SDK 当我部署时 它会不断回收 如果我通过远程桌面进入实例 我可以手动打开应用程序并且它会运行 没有黄屏死机 因此必须有一些有关部署的信息 在事件查看器中我看到错误
  • 在 Linq 中添加对 XML 文档的样式表引用?

    我创建了一个 XML 文档 并希望获得对 XSLT 文件的引用 到此 XML 生成 XElement xml new XElement ReportedOn from dl in EL DocumentLog ToList join o i
  • 如何使用 Trie 进行拼写检查

    我有一个根据单词词典构建的特里树 我想用它来进行拼写检查 并建议字典中最接近的匹配项 也许对于给定数量的编辑x 我想我会在目标单词和字典中的单词之间使用 levenshtein 距离 但是有没有一种聪明的方法可以遍历 trie 而不需要对每
  • 测试 powermock 模拟客户端调用的 http 服务器超时

    我需要为 connectTimeout 和 SocketTimeout 异常编写测试用例 我使用 powerMock 创建模拟对象 下面是我的代码 但是我的模拟对象出现空指针异常 任何帮助表示赞赏 package com util impo
  • .NET类设计问题

    我有一个名为 Question 的类 它有一个名为 Type 的属性 基于这种类型 我想以特定的方式将问题呈现为html 多项选择 单选按钮 多个答案 复选框等 我从一个 RenderHtml 方法开始 该方法根据问题类型调用子方法 但我认
  • 如何更改Spring-WS的“SOAP-ENV”默认前缀

    我使用 Spring WS 创建了一个 Web 服务 为了保持与旧系统的兼容性 我需要将命名空间前缀从SOAP ENV to soap 我知道SOAP ENV and soap只是命名空间前缀 只要它们引用正确的命名空间 http sche
  • 在Android应用程序中导入Java项目?

    即使 Java 项目中的某些类在普通 Android 项目中无法识别 我是否可以在 Android 项目中使用 Java 项目 例如javax xml包 我认为有两种可能性 使用该 java 项目创建一个 jar 并将其导入到 androi
  • 无法实例化类:org.jnp.interfaces.NamingContextFactory

    这是我的代码 扬声器远程 java package test import javax ejb Remote Remote public interface SpeakerRemote String sayAPhrase String ph
  • 如何阻止TreeItem选择?

    我正在与一个TreeTableView JavaFX 8 有一些树节点必须禁用才能选择 我已经尝试过选择活动 但它不起作用 请查找以下代码以获取更多信息 treeTableView getSelectionModel selectedIte
  • 有什么方法可以处理 HTTP/2 Goaway 在 HttpClient java 中收到的 IOException 吗?

    我在应用程序中进行 API 调用 在某个时候它会随机抛出java io IOException 149 222 1 1 553232 GOAWAY received 使用Java 11环境 无论如何要解决此异常而不是迁移到 Http 1 1
  • 使用 FileOutputStream 创建 UTF-8 PDF 文件

    我正在使用 JasperReports 和 DynamicReports 以及这段 java 代码来创建包含 utf 8 字符的 pdf 格式的报告 问题是生成的 pdf 文件根本不包含 utf 8 字符 就像它们已被替换为 使用 Outp
  • Maven 依赖项插件无法解析插件的手动指定依赖项

    我遇到了一个问题maven dependency plugin Maven版本3 2 3 maven dependency plugin版本2 10 我正在尝试引入插件依赖项 我创建了一个简单的项目

随机推荐

  • 对象销毁对于加密目的可靠吗?

    作为后续这个问题 https stackoverflow com questions 57515813 我正在想象一个存储敏感数据 例如加密密钥 的类 为了简化事情 假设不涉及继承 struct Credential std array
  • awk 有条件地组合多行

    我想将多行不同长度的值合并到一行 如果它们与 ID 匹配 输入示例是 ID Value a 1 49 a 2 75 b 1 120 b 2 150 b 3 211 c 1 289 d 1 301 d 2 322 所需的输出示例是 ID Va
  • AngularJS 中的 IE11 访问被拒绝

    每个开发管道都有 2 个部分 首先努力工作并开发应用程序 其次要更加努力 让它兼容伟大的IE 我们有一个AngularJS v1 3 13 没有任何服务器端代码开发的应用程序Webstorm 我们在做REST致电服务 我们的应用程序在 Ch
  • 如何访问 json 数据中的嵌套数组

    我想访问leagueTable此数组内JSON数据 缩短的JSON看起来像这样 每个数组并不显示所有数据以保存滚动 如何访问 leagueTable 数组中的值 data fixtures fixtureId 4950418 fixture
  • 如何在linux上设置android SDK进行命令行开发?

    我正在尝试设置 android SDK 在 Linux Ubuntu 9 10 的命令行上开发一个简单的程序 我尝试过 eclipse 但它在 Ubuntu 上运行有问题 所以我放弃了 这是我到目前为止所做的 从下载 android sdk
  • TMP环境变量发生了什么?

    我总是听说在 UNIX 计算机上查找临时文件夹的正确方法是查看 TMP 环境变量 当编写适用于 Windows 和 Linux 的代码时 我会检查 TEMP 和 TMP 今天 我发现我的 Ubuntu 安装根本没有该环境变量 我知道您似乎总
  • SQL SERVER (express) 中的连接池 - 推荐数量?

    对于我使用连接池的每个应用程序 是否有建议的连接量 我的应用程序在 同一 服务器上使用 ASP NET 和 C 来对抗 sql Express 我有 5 个应用程序正在运行 它们没有被频繁使用 所有连接都打开和关闭 所以我正在考虑将每个应用
  • 如何在 JavaScript 中获取 gif 图像的持续时间

    我只尝试显示一次 gif 所以我使用这段代码来实现这一点 var ui img document getElementById ui image ui img hidden false setTimeout function ui img
  • 如何将输入类型时间的值传递给 Date 对象?

    此函数将时间转换为 12 小时格式 感谢 Stack Overflow 上此函数的贡献者 JS function ampm date var hours date getHours var minutes date getMinutes v
  • HTML Purifier 配置中的白名单表单

    我使用 HTML Purifier 来清理 CMS 中的输入 我的许多客户喜欢在他们的网站上有 PayPal 捐赠按钮 但 HTML Purifier 删除了这些表格 我注意到 HTML Purifier 有一个HTMLPurifier H
  • ExecutorService 与休闲线程 Spawner

    我有一个关于如何的基本问题ExecutorService在 Java 中工作 很难看出简单创建之间的区别Threads并行执行一些任务并将每个任务分配给ThreadPool The ExecutorService使用起来也看起来非常简单和高
  • Windows中有没有办法根据Python的需要抛出BSOD?

    我正在制作一个脚本来测试一些始终运行的软件 并且我想测试它从 BSOD 的恢复情况 有没有一种方法可以从 python 抛出蓝屏而不调用外部脚本或可执行文件 如 OSR 的 BANG 有趣的事情 Windows 内核函数可以做到这一点 我假
  • iOS ScrollView 需要对 y 位置或高度进行约束

    ViewController View ScrollView Top Bottom Leading Trailing spaces to superview set to 0 ContentView Top Bottom Leading T
  • 删除 PO 文件的所有模糊条目

    有谁知道从 PO 文件中批量删除所有模糊翻译的方法 就像是 if fuzzy TRUE 然后 SET msgstr AND REMOVE fuzzy 如果安装了 gettext 您可以使用 msgattrib 命令来完成此操作 msgatt
  • UISearchDisplayController 上出现僵尸问题

    我在使用带有 UITableView 的 UISearchDisplayController 时遇到了僵尸 UISearchDisplayController 以及视图的其余部分 是通过界面生成器 xcode 5 上的故事板并仅使用 ARC
  • 请求的 dll 执行级别

    我正在开发一个 WinForms 应用程序 Vista Win7 中有一小部分功能需要以管理员身份运行 我了解如何在清单中设置应用程序的requestedExecutionLevel 诀窍是 我不想要求用户以管理员身份运行整个应用程序 而只
  • 有没有简单的 Java REST 教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C++ - 指针传递问题

    有人对如何通过有任何想法吗boost shared ptr 按值或按引用 在我的平台上 32位 sizeof shared ptr 等于 8 个字节 看起来我应该通过引用传递它们 但也许有人有其他意见 做了配置文件 类似的东西 在 C 中
  • 避免从主干视图重新渲染图像和其他内容

    当我重新渲染主干视图时 有什么好方法可以跳过重新渲染图像和谷歌地图等内容 每次重新渲染视图时 我的照片和地图视图都会闪烁得很厉害 这种情况很常见 特别是对于图像 模板引擎从头开始布局布局 这会导致图像标记再次从服务器或从缓存中获取位图 当然
  • 您能解释一下流的概念吗?

    我知道流是字节序列的表示 每个流都提供了向其给定的后备存储读取和写入字节的方法 但流的意义何在 为什么我们与之交互的不是后备存储本身 不管出于什么原因 这个概念并不适合我 我读过很多文章 但我想我需要一个类比或其他东西 选择 流 这个词是因