当文档提示我不应该能够使用Console.ReadLine读取超过254个字符时,为什么?

普希金

文档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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能读取长度超过4094个字符的UTF-16文件?

当输出为CSV时,为什么我的字符串不能超过32758个字符?

为什么我不应该使用“ inout”而不是“ in”或“ out”?

为什么我不应该使用'kill -9'/ SIGKILL

我什么时候不应该使用属性

为什么Twitter仅说130个帖子,我的状态更新超过140个字符?

当我的输入变量超过 1 个字符时,为什么我没有得到任何结果?

为什么不应该使用componentWillMount?

为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

为什么我在使用 http 服务时不应该得到响应

从UITextField更新UILabel时,为什么我的标签留下1个字符?

我不应该能够填充通过转换派生的列吗?

在不应该使用的makefile规则时

当我运行Windows bat通过添加长度超过2个字符的前缀来重命名一组文件时,为什么第一个文件将被重命名两次?

为什么我不应该将“可重复读取”与锁定读取一起使用(选择“用于更新”)?

为什么我的循环仅从我的.obj文件中读取一个字符?

为什么我不应该使用不可变的POJO而不是JavaBean?

为什么我不应该在ARMv6 +的系统内存上使用ioremap?

为什么我不应该使用CDN进行React和Babel?

为什么我不应该为max_connections使用最大值

为什么我们不应该在Java中使用受保护的静态

为什么我们不应该直接使用默认 QoS?

为什么我们不应该使用Spring MVC控制器@Transactional?

为什么我不应该在PHP中使用mysql_ *函数?

为什么我不应该使用catch()处理React useEffect API调用中的错误?

为什么我不应该在继承中使用平等?

为什么我不应该在Android中使用System.out.println()

C#为什么我不应该使用协程?

为什么我不应该包含cpp文件而是使用标头?