ToArray() 函数限制

ToArray() function limitation

我正在使用 .ToArray() 方法将我的字符串转换为 char 数组,其大小已保持 char[] buffer = new char[1000000]; 但是当我使用以下代码时:

using (StreamReader streamReader = new StreamReader(path1))
{
    buffer = streamReader.ReadToEnd().ToCharArray();
}
// buffer = result.ToArray();
threadfunc(data_path1);

缓冲区的大小固定为 8190,即使在使用 .ToCharArray().ToArray() 后它没有读取整个文件。 .ToCharArray().ToArray() 有大小限制的原因是什么?就好像我不使用这个函数一样,我能够以字符串格式读取整个文件,但是当尝试使用这个函数将它转换为 char 数组时,我遇到了大小限制。

ToCharArray() returns 数组的新实例。因此,您的 buffer 将引用 ReadToEnd 返回的数据大小的新实例。

如果你想保持 buffer 相同的大小,只需将新数组添加到现有数组中即可

char[] buffer = new char[1000000];
using (StreamReader streamReader = new StreamReader(path1))
{
    var tempArray = streamReader.ReadToEnd().ToCharArray();
    tempArray.CopyTo(buffer, 0);
}

如果您只想使用结果数组 - 您不需要 "predict" 数组的大小 - 只需使用返回的一个

public char[] GetArrayFromFile(string pathToFile)
{
    using (StreamReader streamReader = new StreamReader(path1))
    {
        var data = streamReader.ReadToEnd();
    }
    return data.ToCharArray();
}    

var arrayFromFile = GetArrayFromFile(@"..\path.file");

您可能使用了不正确的编码。默认StreamReader(String)使用UTF8编码:

The complete file path is specified by the path parameter. This constructor initializes the encoding to UTF8Encoding and the buffer size to 1024 bytes.

不要预先分配缓冲区大小,除非您有特定需要。

如果您的文件是 ASCII 格式,您需要更新 StreamReader 构造函数:

char[] buffer = null;

using (StreamReader streamReader = new StreamReader(path1, Encoding.ASCII))
{
    buffer = streamReader.ReadToEnd().ToCharArray();
}
// buffer = result.ToArray();
threadfunc(data_path1);

我的猜测是问题在于读取结束应该在您调用 ToCharArray() 之前完成。这可能对你有帮助。您不需要定义缓冲区,因为 ToCharArray() 会创建 char[] 本身的新实例。

string content;
using (StreamReader streamReader = new StreamReader(path1))
{
    content = streamReader.ReadToEnd();
}
var buffer = content.ToCharArray();

您的文件是否包含二进制数据?如果它包含 EOF 字符并且流是以文本模式打开的(StreamReader),该字符将表示文件结束,即使它实际上不是文件的结尾。

我可以通过在文本模式下随机读取 .exe 文件来重现此内容。