该文档的Console.ReadLine
说:
默认情况下,该方法从256个字符的输入缓冲区读取输入。因为这包括Environment.NewLine字符,所以该方法可以读取最多254个字符的行。要读取更长的行,请调用OpenStandardInput(Int32)方法。
但是,我可以阅读的文字不止这些。运行一个简单的程序,例如:
string s = Console.ReadLine();
Console.WriteLine(s);
Console.WriteLine(s.Length);
Console.ReadKey();
输入如下:
aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjjaaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj
返回长度为500的相同输入。
这里是可运行的示例。
那么文档是否过时了,还是这里的“默认”字样是关键词?
更新: Jeremy发现源代码中定义的限制为4096 。
我已验证.NET Core应用程序将仅从stdin中读取前4094个字符(不包括换行符)。
就我而言,我实际上有一个.NET Core 3.1进程,该进程启动.NET Framework 4.6进程,并重定向其StandardOut和StandardIn。我已验证.NET Framework进程可以通过Console.ReadLine()
.NET Core 3.1进程通过以下方式成功发送10亿个字符:fwProcess.StandardInput.WriteLine(Serialize(<some stuff>));
将.NET Framework进程替换为.NET Core进程时,此方法也适用。
因此,似乎在重定向stdout / stdin时不适用256个字符的限制,但是如果有人可以找到解释这一点的权威证据/文档,我将不胜感激。我想知道,如果仍然有一个限制(不包括OutOfMemory情况),但它是11亿个字符。我还想知道这是否依赖于平台(我在Windows 10上)。
如果有帮助,这就是我正在运行的代码。
ConsoleApp1:
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();
ConsoleApp2:
string s = Console.ReadLine();
Console.WriteLine(s);
从这里解释:
默认的cmd控制台模式为“ ENABLE_LINE_INPUT”,这意味着当代码对stdin发出:: ReadFile调用时,:: ReadFile直到遇到回车符时才返回给调用者。但是对ReadFile的调用只有传递给它的有限大小的缓冲区。这意味着cmd会查看提供给它的缓冲区大小,并基于该行可以有多少个字符来确定...如果该行较长,它将无法将所有数据存储到缓冲区中。
Console.In
现在,打开时使用的默认缓冲区大小为4096(源)
该文档是开源的,如果您要提交问题或请求请求,可以在这里找到。
重定向StandardOut / StandardIn时,此限制不适用。从这里:
限制是您传递多少内存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句