从Console.ReadList/Read 的源码中,可学习到.NET CORE 是怎么样来读取输入流。

也可以学习到是如何使用P/Invoke来调用系统API

Console.ReadList 的源码为

        [MethodImplAttribute(MethodImplOptions.NoInlining)]public static string ReadLine(){return In.ReadLine();}

其中In为。

internal static T EnsureInitialized<T>(ref T field, Func<T> initializer) where T : class =>LazyInitializer.EnsureInitialized(ref field, ref InternalSyncObject, initializer);public static TextReader In => EnsureInitialized(ref s_in, () => ConsolePal.GetOrCreateReader());

可以看到他是个TextRead

internal static TextReader GetOrCreateReader(){Stream inputStream = OpenStandardInput();return SyncTextReader.GetSynchronizedTextReader(inputStream == Stream.Null ?StreamReader.Null :new StreamReader(stream: inputStream,encoding: new ConsoleEncoding(Console.InputEncoding),detectEncodingFromByteOrderMarks: false,bufferSize: Console.ReadBufferSize,leaveOpen: true));}

继续跳转,查看方法OpenStandardInput

public static Stream OpenStandardInput(){return GetStandardFile(Interop.Kernel32.HandleTypes.STD_INPUT_HANDLE, FileAccess.Read);}

继续看方法

private static Stream GetStandardFile(int handleType, FileAccess access){IntPtr handle = Interop.Kernel32.GetStdHandle(handleType);// 此处源码一坨注释被我删掉了。^_^if (handle == IntPtr.Zero || handle == InvalidHandleValue ||(access != FileAccess.Read && !ConsoleHandleIsWritable(handle))){return Stream.Null;}return new WindowsConsoleStream(handle, access, GetUseFileAPIs(handleType));}

哈哈,终于要看到了Interop.Kernel32.GetStdHandle 这个方法就是调用系统API接口函数的方法。

<!-- Windows --><ItemGroup Condition="'$(TargetsWindows)' == 'true'"><Compile Include="$(CommonPath)\CoreLib\Interop\Windows\Kernel32\Interop.GetStdHandle.cs"><Link>Common\CoreLib\Interop\Windows\Interop.GetStdHandle.cs</Link></Compile>
</ItemGroup>
<!-- Unix -->
<ItemGroup Condition=" '$(TargetsUnix)' == 'true'">
</ItemGroup>

回到GetStandardFile 中看到返回一个WindowsConsoleStream

useFileAPIs 参数,决定是使用操作系统 ReadFile还是 ReadConsole API。


对于.NET CORE 源码中有很多 XXXX.Unix.cs,XXXX.Windows.cs

.NET CORE 怎么样从控制台中读取输入流相关推荐

  1. Java从控制台中读取数据完全攻略

    0 引言 从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增 ...

  2. 在浏览器的控制台中读取本机文件

    在浏览器的控制台中读取本机文件 最近有这么一个需求:通过js代码直接读取到本机文件(项目部署并运行在浏览器端),这里所说的直接读取不同于input标签点击之后选择文件然后通过FileReader读取到 ...

  3. C#_解决在控制台中输入Ctrl+Z的问题

    本人在前几天做了一道题如下(在116行中用(int)cki.KeyChar==26解决了C#中在控制台捕捉Ctrl+Z): 解决的方法也是请教了老师,经老师调试过才得出的解决方法.(因在Console ...

  4. 海贼王为什么画风突变_突变对象时控制台中会记录什么

    海贼王为什么画风突变 by Boris Sever 通过鲍里斯·塞弗(Boris Sever) 突变对象时控制台中会记录什么 (What gets logged in the console when ...

  5. JavaScript控制台中的颜色

    本文翻译自:Colors in JavaScript console Can Chrome's built-in JavaScript console display colors? Chrome的内 ...

  6. 深入分析H2数据库控制台中无需身份验证的RCE漏洞

    简介 最近,JFrog安全研究团队披露了H2数据库控制台中的一个安全漏洞,其编号为CVE-2021-42392.这个安全漏洞与Apache Log4j中臭名昭著的Log4Shell漏洞(JNDI远程类 ...

  7. 在控制台中录入一个字符串 , 打印这个字符串中的字符以及出现的次数(Python)

    #练习2:在控制台中录入一个字符串 # 打印这个字符串中的字符以及出现的次数. # abcdbcdb # a字符1次 # b 3 # c 2 # d 2 str_input = "abcdb ...

  8. 在控制台中输入月,日. 计算这是一年的第几天.(Python)

    #在控制台中输入月,日. # 计算这是一年的第几天. # 例如:3月5日 # 累加1月,2月总天数,再累加3月的5天. # 例如:5月10日 # 累加1月,2月,3月,4月总天数,再累加5月的10天. ...

  9. 在控制台中循环录入字符串,输入q时退出。 然后显示一个新的字符(Python)

    """ 在控制台中循环录入字符串,输入q时退出. 然后显示一个新的字符 """ list01 = [] while True:str_inp ...

最新文章

  1. 题目 1083:【蓝桥杯】【入门题】Hello, world!
  2. 报错org.apache.htrace htrace-core4 4.1.0 incubating htrace-core4.jar 报错spark
  3. ssl1213-多边形面积【差积,计算几何】
  4. xcode多工程联编 - 详细教程
  5. python pyquery库_python解析HTML之:PyQuery库的介绍与使用
  6. Java获取数据类型
  7. 04 | 事件调度层:为什么 EventLoop 是 Netty 的精髓?
  8. mysql 主从复制日志_mysql主从复制基于日志复制
  9. java 需要 不是语句,我应该避免使用Java标签语句吗?
  10. C# 固高运动控制卡插补
  11. OGNL表达式的介绍
  12. 关于Dr.Com3.73多人上网的破解(一)
  13. 【第三方互联】微博1、注册成为新浪微博(sina)开发者
  14. 【强化学习】强化学习介绍
  15. 利用HomeKit、智汀家庭云,让不同生态智能家居实现互联互通
  16. 51nod3431 取石子游戏
  17. 这一年又是稀里糊涂地度过了
  18. IPv6与ICMPv6
  19. 哈里波特与魔法石pdf_哈里·罗伯茨(CSS)CSS框架的命运与失败
  20. 实验........

热门文章

  1. 【小安翻唱】凉宫春日的忧郁--冒険でしょでしょ第五届外语歌曲大赛助兴节目~绫魂论坛送aya的生日礼物筹备开始~...
  2. RFID会议签到系统总结(二十一)――服务端的通讯
  3. 使用mcBackup备份Windows 7 Media Center设置
  4. 番茄工作法—《可以量化的管理学》
  5. python学习笔记 --- 随机数进阶
  6. wireshark远程抓包
  7. [iOS]应用内支付(内购)的个人开发过程及坑!
  8. SSH项目中遇到拦截器无法注入服务的问题
  9. NET 6 中新增的LINQ 方法
  10. C# WPF MVVM开发框架Caliburn.Micro IResult和协同程序⑥