2

这是我读取文件的方式:

    public static string readFile(string path)
    {
        StringBuilder stringFromFile = new StringBuilder();
        StreamReader SR;
        string S;
        SR = File.OpenText(path);
        S = SR.ReadLine();
        while (S != null)
        {
            stringFromFile.Append(SR.ReadLine());
        }
        SR.Close();
        return stringFromFile.ToString();
    }

问题是它太长了(.txt 文件大约 2.5 兆)。花了5多分钟。有没有更好的办法?

采取的解决方案

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

花了不到 1 秒... :)

4

11 回答 11

8
S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(SR.ReadLine());
}

这里需要注意的S是,在该 initial 之后永远不会设置ReadLine(),因此S != null如果您进入 while 循环,则不会触发条件。尝试:

S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(S = SR.ReadLine());
}

或使用其他评论之一。

如果需要删除换行符,请使用 string.Replace(Environment.NewLine, "")

于 2008-10-17T13:34:23.140 回答
6

撇开可怕的变量名和缺少 using 语句(如果有任何异常,您不会关闭文件)应该没问题,当然不应该花 5 分钟来读取 2.5 兆。

文件在哪里?它在不稳定的网络共享上吗?

顺便说一句,您正在做的事情和使用 File.ReadAllText 之间的唯一区别是您正在丢失换行符。这是故意的吗?ReadAllText 需要多长时间?

于 2008-10-17T13:25:03.987 回答
6
return System.IO.File.ReadAllText(path);
于 2008-10-17T13:26:53.017 回答
3

马库斯·格里普说得对。它需要很长时间,因为您有一个无限循环。复制了您的代码并进行了更改,它在不到一秒的时间内读取了一个 2.4 M 的文本文件。

但我认为您可能会错过文件的第一行。试试这个。


S = SR.ReadLine();
while (S != null){
    stringFromFile.Append(S);
    S = SR.ReadLine();
}

于 2008-10-17T13:39:12.647 回答
2

您是否需要一次占用整个 2.5 Mb 内存?

如果没有,我会尝试使用您需要的东西。

于 2008-10-17T13:25:15.750 回答
1

请改用 System.IO.File.RealAllLines。

http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx

或者,估计字符数并将其作为容量传递给 StringBuilder 的构造函数应该可以加快速度。

于 2008-10-17T13:26:46.683 回答
1

试试这个,应该更快:

var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");
于 2008-10-17T13:27:51.127 回答
1

顺便说一句:下次遇到类似情况时,请尝试预分配内存。无论您使用的确切数据结构如何,这都会极大地改善运行时间。大多数容器(StringBuilder以及)都有一个允许您保留内存的构造函数。这样,在读取过程中需要较少耗时的重新分配。

例如,如果要将文件中的数据读入 a 中,可以编写以下代码StringBuilder

var info = new FileInfo(path);
var sb = new StringBuilder((int)info.Length);

(强制转换是必要的,因为System.IO.FileInfo.Lengthis long。)

于 2008-10-17T13:44:48.753 回答
1

ReadAllText 对我来说是一个非常好的解决方案。我将以下代码用于 3.000.000 行文本文件,读取所有行需要 4-5 秒。

string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');
于 2012-12-05T11:21:14.520 回答
0

循环和StringBuilder可能是多余的;尝试使用 ReadToEnd

于 2008-10-17T13:27:51.533 回答
-1

要最快地读取文本文件,您可以使用类似这样的东西

public static string ReadFileAndFetchStringInSingleLine(string file)
    {
        StringBuilder sb;
        try
        {
            sb = new StringBuilder();
            using (FileStream fs = File.Open(file, FileMode.Open))
            {
                using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string str;
                        while ((str = sr.ReadLine()) != null)
                        {
                            sb.Append(str);
                        }
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception ex)
        {
            return "";
        }
    }

希望这会帮助你。欲了解更多信息,请访问以下链接 - 阅读文本文件的最快方式

于 2016-06-23T07:48:31.173 回答