如何使用c#读取整个文件到字符串?

将文本文件读入字符串变量的最快方法是什么?

我理解它可以通过几种方式完成,比如读取单个字节,然后将它们转换为字符串。我在寻找一种编码最少的方法。

318735 次浏览

File.ReadAllText怎么样:

string contents = File.ReadAllText(@"C:\temp\test.txt");
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
string contents = System.IO.File.ReadAllText(path)

这里是MSDN文档

用最少的c#代码最快的方法可能就是这个:

string readText = System.IO.File.ReadAllText(path);
string content = System.IO.File.ReadAllText( @"C:\file.txt" );

看看File.ReadAllText ()方法

一些重要备注:

这个方法打开一个文件,读取文件的每一行,然后添加 每一行作为字符串的一个元素。然后关闭文件。一条线 定义为字符序列后面跟着一个回车 ('\r'),换行('\n'),或者紧随其后的回车 通过换行。结果字符串不包含终止符

.回车和换行

该方法尝试自动检测文件的编码 基于字节顺序标记的存在。编码格式为UTF-8和 可以检测到UTF-32(大端序和小端序)

读取时使用ReadAllText(String, Encoding)方法重载 可能包含导入文本的文件,因为无法识别 字符可能无法正确读取。< / p >

文件句柄被此方法保证关闭,即使 引发异常

你也可以从文本文件中读取文本到字符串,如下所示

string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
str = str + sr.ReadLine();
}

File.ReadAllLinesc#文件处理中的StreamReader ReadLine的基准比较

文件读取比较

< p >结果。StreamReader对于10000 +的大文件要快得多 行,但对于较小的文件,差异可以忽略不计。像往常一样, 计划不同大小的文件,并使用File。仅当

< br >

StreamReader方法

正如其他人所建议的File.ReadAllText方法,你也可以尝试(我没有定量测试性能影响,但它似乎比File.ReadAllText更快(参见下面的比较))。不过,性能中的区别只在较大文件的情况下才可见。

string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
readContents = streamReader.ReadToEnd();
}

< br >

File.Readxxx()与StreamReader.Readxxx()的比较

通过ILSpy查看指示性代码,我发现了以下关于File.ReadAllLinesFile.ReadAllText

  • File.ReadAllText -在内部使用StreamReader.ReadToEnd
  • File.ReadAllLines -也在内部使用StreamReader.ReadLine,额外的开销是创建List<string>作为读行返回,并循环直到文件结束。
< p > < br > 所以这两个方法都是建立在StreamReader之上的额外的便利层。这从该方法的指示体中可以明显看出。< / p >

File.ReadAllText()实现被ILSpy反编译

public static string ReadAllText(string path)
{
if (path == null)
{
throw new ArgumentNullException("path");
}
if (path.Length == 0)
{
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
}
return File.InternalReadAllText(path, Encoding.UTF8);
}


private static string InternalReadAllText(string path, Encoding encoding)
{
string result;
using (StreamReader streamReader = new StreamReader(path, encoding))
{
result = streamReader.ReadToEnd();
}
return result;
}

@Cris抱歉,这是引用MSDN Microsoft

方法

在这个实验中,将对两个班级进行比较。StreamReaderFileStream类将被指示从应用程序目录中读取两个10K和200K的完整文件。

StreamReader (VB.NET)


sr = New StreamReader(strFileName)
Do
line = sr.ReadLine()
Loop Until line Is Nothing
sr.Close()


FileStream (VB.NET)


Dim fs As FileStream
Dim temp As UTF8Encoding = New UTF8Encoding(True)
Dim b(1024) As Byte
fs = File.OpenRead(strFileName)
Do While fs.Read(b, 0, b.Length) > 0
temp.GetString(b, 0, b.Length)
Loop
fs.Close()

结果

enter image description here

FileStream在这个测试中明显更快。StreamReader读取这个小文件要多花50%的时间。对于大文件,它需要额外的27%的时间。

StreamReader是专门寻找换行符,而FileStream不是。这将占用一些额外的时间。

建议

根据应用程序需要对某段数据做什么,可能会有额外的解析,这将需要额外的处理时间。考虑一个场景,其中文件有数据列,行是CR/LF分隔的。StreamReader将沿着文本行查找CR/LF,然后应用程序将执行额外的解析以查找数据的特定位置。(你认为弦。子字符串没有价格?)

另一方面,FileStream以块的形式读取数据,积极主动的开发人员可以编写更多的逻辑来使用流。如果需要的数据位于文件中的特定位置,这当然是一种方法,因为它可以降低内存使用量。

FileStream是更好的速度机制,但需要更多的逻辑。

string text = File.ReadAllText("Path");你在一个字符串变量中有所有的文本。如果你需要每一行单独,你可以使用这个:

string[] lines = File.ReadAllLines("Path");

我在一个ReadAllText和StreamBuffer之间做了一个比较,一个2Mb的csv,它的差异似乎是相当小的,但ReadAllText似乎从完成函数所需的时间占上风。

如果你想从应用程序的Bin文件夹中选择文件,那么你可以尝试以下操作,不要忘记做异常处理。

string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));

对于那些觉得这个东西很有趣的新手来说,在大多数情况下(根据这些基准)将整个文件读入字符串的最快方法是通过以下方法:

using (StreamReader sr = File.OpenText(fileName))
{
string s = sr.ReadToEnd();
}
//you then have to process the string

然而,绝对最快的读取文本文件的整体似乎是以下:

using (StreamReader sr = File.OpenText(fileName))
{
string s = String.Empty;
while ((s = sr.ReadLine()) != null)
{
//do what you have to here
}
}

与其他几种技术相比较,它赢得了大部分时间,包括对BufferedReader。

你可以使用:

 public static void ReadFileToEnd()
{
try
{
//provide to reader your complete text file
using (StreamReader sr = new StreamReader("TestFile.txt"))
{
String line = sr.ReadToEnd();
Console.WriteLine(line);
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
}

你可以这样用

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 "";
}
}

希望这对你有所帮助。