.NET CORE 怎么样从控制台中读取输入流
从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 怎么样从控制台中读取输入流相关推荐
- Java从控制台中读取数据完全攻略
0 引言 从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增 ...
- 在浏览器的控制台中读取本机文件
在浏览器的控制台中读取本机文件 最近有这么一个需求:通过js代码直接读取到本机文件(项目部署并运行在浏览器端),这里所说的直接读取不同于input标签点击之后选择文件然后通过FileReader读取到 ...
- C#_解决在控制台中输入Ctrl+Z的问题
本人在前几天做了一道题如下(在116行中用(int)cki.KeyChar==26解决了C#中在控制台捕捉Ctrl+Z): 解决的方法也是请教了老师,经老师调试过才得出的解决方法.(因在Console ...
- 海贼王为什么画风突变_突变对象时控制台中会记录什么
海贼王为什么画风突变 by Boris Sever 通过鲍里斯·塞弗(Boris Sever) 突变对象时控制台中会记录什么 (What gets logged in the console when ...
- JavaScript控制台中的颜色
本文翻译自:Colors in JavaScript console Can Chrome's built-in JavaScript console display colors? Chrome的内 ...
- 深入分析H2数据库控制台中无需身份验证的RCE漏洞
简介 最近,JFrog安全研究团队披露了H2数据库控制台中的一个安全漏洞,其编号为CVE-2021-42392.这个安全漏洞与Apache Log4j中臭名昭著的Log4Shell漏洞(JNDI远程类 ...
- 在控制台中录入一个字符串 , 打印这个字符串中的字符以及出现的次数(Python)
#练习2:在控制台中录入一个字符串 # 打印这个字符串中的字符以及出现的次数. # abcdbcdb # a字符1次 # b 3 # c 2 # d 2 str_input = "abcdb ...
- 在控制台中输入月,日. 计算这是一年的第几天.(Python)
#在控制台中输入月,日. # 计算这是一年的第几天. # 例如:3月5日 # 累加1月,2月总天数,再累加3月的5天. # 例如:5月10日 # 累加1月,2月,3月,4月总天数,再累加5月的10天. ...
- 在控制台中循环录入字符串,输入q时退出。 然后显示一个新的字符(Python)
""" 在控制台中循环录入字符串,输入q时退出. 然后显示一个新的字符 """ list01 = [] while True:str_inp ...
最新文章
- 题目 1083:【蓝桥杯】【入门题】Hello, world!
- 报错org.apache.htrace htrace-core4 4.1.0 incubating htrace-core4.jar 报错spark
- ssl1213-多边形面积【差积,计算几何】
- xcode多工程联编 - 详细教程
- python pyquery库_python解析HTML之:PyQuery库的介绍与使用
- Java获取数据类型
- 04 | 事件调度层:为什么 EventLoop 是 Netty 的精髓?
- mysql 主从复制日志_mysql主从复制基于日志复制
- java 需要 不是语句,我应该避免使用Java标签语句吗?
- C# 固高运动控制卡插补
- OGNL表达式的介绍
- 关于Dr.Com3.73多人上网的破解(一)
- 【第三方互联】微博1、注册成为新浪微博(sina)开发者
- 【强化学习】强化学习介绍
- 利用HomeKit、智汀家庭云,让不同生态智能家居实现互联互通
- 51nod3431 取石子游戏
- 这一年又是稀里糊涂地度过了
- IPv6与ICMPv6
- 哈里波特与魔法石pdf_哈里·罗伯茨(CSS)CSS框架的命运与失败
- 实验........
热门文章
- 【小安翻唱】凉宫春日的忧郁--冒険でしょでしょ第五届外语歌曲大赛助兴节目~绫魂论坛送aya的生日礼物筹备开始~...
- RFID会议签到系统总结(二十一)――服务端的通讯
- 使用mcBackup备份Windows 7 Media Center设置
- 番茄工作法—《可以量化的管理学》
- python学习笔记 --- 随机数进阶
- wireshark远程抓包
- [iOS]应用内支付(内购)的个人开发过程及坑!
- SSH项目中遇到拦截器无法注入服务的问题
- NET 6 中新增的LINQ 方法
- C# WPF MVVM开发框架Caliburn.Micro IResult和协同程序⑥