2

我正在使用该.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()or后没有读取整个文件.ToArray()。这样做的原因是什么.ToCharArray().ToArray()有大小限制?好像我不使用此函数一样,我能够以字符串格式读取整个文件,但是当尝试使用此函数将其转换为 char 数组时,我遇到了大小限制。

4

4 回答 4

2

我的猜测是问题是 read to end 应该在你调用ToCharArray(). 这可能会帮助你。您不需要定义缓冲区,因为ToCharArray()它会创建char[]自己的新实例。

string content;
using (StreamReader streamReader = new StreamReader(path1))
{
    content = streamReader.ReadToEnd();
}
var buffer = content.ToCharArray();
于 2017-02-27T07:45:00.073 回答
1

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

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

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

如果你只想使用结果数组 - 你不需要“预测”数组的大小 - 只需使用返回的

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

var arrayFromFile = GetArrayFromFile(@"..\path.file");
于 2017-02-27T07:40:51.583 回答
0

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

完整的文件路径由 path 参数指定。此构造函数将编码初始化为 UTF8Encoding 并将缓冲区大小初始化为 1024 字节。

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

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

char[] buffer = null;

using (StreamReader streamReader = new StreamReader(path1, Encoding.ASCII))
{
    buffer = streamReader.ReadToEnd().ToCharArray();
}
// buffer = result.ToArray();
threadfunc(data_path1);
于 2017-02-27T07:44:20.033 回答
0

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

我可以通过在文本模式下读取随机 .exe 文件来重现这一点。

于 2017-02-27T07:56:42.353 回答