C# 当文档建议我不应该';你不能吗?
控制台的读取线说: 默认情况下,该方法从256个字符的输入缓冲区读取输入。因为这包括Environment.NewLine字符,所以该方法可以读取最多包含254个字符的行。要读取较长的行,请调用OpenStandardInput(Int32)方法 然而,我能读的不仅仅是那么多的字,我看得很好。运行一个简单的程序,如:C# 当文档建议我不应该';你不能吗?,c#,.net,.net-core,console,console.readline,C#,.net,.net Core,Console,Console.readline,控制台的读取线说: 默认情况下,该方法从256个字符的输入缓冲区读取输入。因为这包括Environment.NewLine字符,所以该方法可以读取最多包含254个字符的行。要读取较长的行,请调用OpenStandardInput(Int32)方法 然而,我能读的不仅仅是那么多的字,我看得很好。运行一个简单的程序,如: string s = Console.ReadLine(); Console.WriteLine(s); Console.WriteLine(s.Length); Console
string s = Console.ReadLine();
Console.WriteLine(s);
Console.WriteLine(s.Length);
Console.ReadKey();
输入如下:
aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj
返回长度为500的相同输入
可运行的示例
那么这些文档是否过时了,或者这里是否有“默认”键
更新: Jeremy发现了一个定义为4096的限制 我已经验证了一个.NET核心应用程序将只读取stdin中的前4094个字符(不包括换行符) 在我的例子中,我实际上有一个.NET Core 3.1进程,它启动一个.NET Framework 4.6进程,重定向其StandardOut和StandardIn。我已经验证了.NET Framework进程可以通过
Console.ReadLine()
成功读取10亿个字符,其中.NET Core 3.1进程通过fwProcess.StandardInput.WriteLine(Serialize())发送框架进程内容代码>
当.NET框架进程替换为.NET核心进程时,这种方法也有效
因此,在重定向stdout/stdin时,256个字符的限制似乎不适用,但如果有人能找到解释这一点的最终证据/文档,我将不胜感激。如果仍然有一个限制(不包括OutOfMemory的情况),但它是11亿个字符,我想知道。我还想知道这是否取决于平台(我使用的是Windows 10)
如果有帮助,这就是我正在运行的代码
控制台AP1:
ProcessStartInfo processInfo = new ProcessStartInfo {
CreateNoWindow = true,
FileName = "ConsoleApp2.exe",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true
};
StringBuilder s = new StringBuilder();
var proc = Process.Start(processInfo);
int n = 1_000_000_000;
for (int i = 0; i < n; i++)
s.Append("a");
proc.StandardInput.WriteLine(s.ToString());
string s = proc.StandardOutput.ReadLine();
Console.WriteLine(s.Length == n); // logs True
Console.ReadKey();
转述自:
默认的cmd控制台模式是“ENABLE_LINE_INPUT”,这意味着
当代码对stdin发出::ReadFile调用时,::ReadFile不会
返回调用方,直到遇到回车符。但是
对ReadFile的调用只传递了一个有限大小的缓冲区。
这意味着cmd会查看提供给它的缓冲区大小
根据行的长度来确定。。。
如果行较长,它将无法存储所有数据
进入缓冲区
在
中打开控制台时使用的默认缓冲区大小现在是4096()
该文档是开源的,如果您希望提交问题或请求,请参阅
重定向StandardOut/StandardIn时,此限制不适用。发件人:
限制是您传入的内存量
具体来说,我使用的是运行.NETCore3.1的win10。在控制台中,有一个私有属性_maxCharsPerBuffer=16384。不确定这是否因平台而异,Microsoft可能会在文档中声明“最小”大小?@T.S.嗯,我的问题与那个不同。我不是问是否有一个最大长度。我在问为什么我没有这个极限documented@T.S.嗯,我想问题的主体与标题有点不同。我想这和我的关系比我想象的要大很多关于github的问题?谢谢,这很有帮助。我更新了我的问题,注意到在两个网络进程之间发送数据似乎没有这个限制。我可以从.NET FW进程中成功读取数万个字符。如果FW中有不同的限制,我会搜索。(重定向stdin/stdout)正如我在回答中所引用的,这种行为取决于从交互式控制台读取。这就是行为的起源。我认为应该更改.net的
控制台.ReadLine
,以隐藏此操作系统实现细节,并继续阅读,直到找到实际的新行。
string s = Console.ReadLine();
Console.WriteLine(s);