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 文件来重现此内容。
我正在使用 .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 文件来重现此内容。