将文本文件读入字符串变量的最快方法是什么?
我知道它可以通过多种方式完成,例如读取单个字节,然后将它们转换为字符串。我正在寻找一种编码最少的方法。
答案 0 :(得分:332)
怎么样
string contents = File.ReadAllText(@"C:\temp\test.txt");
答案 1 :(得分:159)
File.ReadAllLines
与StreamReader ReadLine
的基准比较
结果。对于10,000+以上的大型文件,StreamReader要快得多 行,但较小文件的差异可以忽略不计。一如既往, 计划不同大小的文件,并仅在使用File.ReadAllLines时 表现并不重要。
由于其他人建议使用File.ReadAllText
方法,您也可以尝试更快(我没有定量测试性能影响,但它似乎比{{1更快) (见下面的比较))。只有在文件较大的情况下,性能difference才会显示。
File.ReadAllText
通过ILSpy查看指示性代码我发现了以下关于string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
readContents = streamReader.ReadToEnd();
}
,File.ReadAllLines
的内容。
File.ReadAllText
- 内部使用File.ReadAllText
StreamReader.ReadToEnd
- 内部也使用File.ReadAllLines
,额外开销创建StreamReader.ReadLine
作为读取行返回并循环到文件末尾。
因此,这两种方法都是在List<string>
之上构建的附加便利层。这通过该方法的指示性主体是显而易见的。
StreamReader
实施
File.ReadAllText()
答案 2 :(得分:16)
string contents = System.IO.File.ReadAllText(path)
答案 3 :(得分:6)
一些重要的评论:
此方法打开一个文件,读取文件的每一行,然后添加 每一行作为字符串的元素。然后它关闭文件。一条线 被定义为一个字符序列,后跟一个回车符 ('\ r'),换行符('\ n')或紧接着的回车符 通过换行。结果字符串不包含终止 回车和/或换行。
此方法尝试自动检测文件的编码 基于字节顺序标记的存在。编码格式为UTF-8和 可以检测到UTF-32(big-endian和little-endian)。
读取时使用ReadAllText(String,Encoding)方法重载 可能包含导入文本的文件,因为无法识别 可能无法正确读取字符。
即使这样,该方法也可以保证文件句柄被关闭 异常被提出
答案 4 :(得分:4)
@Cris抱歉。这是引用MSDN Microsoft
方法
在这个实验中,将比较两个类。将指示StreamReader
和FileStream
类从应用程序目录中完整地读取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()
结果
在此测试中,
FileStream
显然更快。 StreamReader
读取小文件需要额外多50%的时间。对于大文件,它花了27%的时间。
StreamReader
专门寻找换行符,而FileStream
却没有。这将占一些额外的时间。
建议
根据应用程序需要对一部分数据执行的操作,可能需要额外的解析,这需要额外的处理时间。考虑一种情况,其中文件包含数据列,并且行以CR/LF
分隔。 StreamReader
将在文本行中查找CR/LF
,然后应用程序将执行额外的解析以查找特定的数据位置。 (您认为String.SubString没有价格吗?)
另一方面,FileStream
以块的形式读取数据,主动开发人员可以编写更多逻辑来使用流来获益。如果所需数据位于文件中的特定位置,那么这肯定是一种方法,因为它会降低内存使用量。
FileStream
是更好的速度机制,但需要更多的逻辑。
答案 5 :(得分:4)
string text = File.ReadAllText("Path");
您在一个字符串变量中包含所有文本。如果您需要单独使用每一行,您可以使用:
string[] lines = File.ReadAllLines("Path");
答案 6 :(得分:3)
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
答案 7 :(得分:3)
最简单的方法是使用尽可能少的C#代码,这可能就是这个:
string readText = System.IO.File.ReadAllText(path);
答案 8 :(得分:3)
如果您想从应用程序的Bin文件夹中选择文件,那么您可以尝试关注并且不要忘记进行异常处理。
string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
答案 9 :(得分:3)
对于那些发现这些东西既有趣又有趣的新手,在大多数情况下(according to these benchmarks)将整个文件读成字符串的最快方法如下:
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
}
}
Put up against several other techniques,它大部分时间都胜出,包括针对BufferedReader。
答案 10 :(得分:2)
string content = System.IO.File.ReadAllText( @"C:\file.txt" );
答案 11 :(得分:2)
你可以使用:
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);
}
}
答案 12 :(得分:2)
你可以这样使用
procedure UpdateDistMsgHandler(var Msg: TMessage); message UM_UPDATEDIST;
procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;
procedure TFrmGoogleMapsLiveUpdate.UpdateDistMsgHandler(var Msg: TMessage);
begin
LabelDistance.Caption := IntToStr(Msg.WParam);
end;
procedure TFrmGoogleMapsLiveUpdate.WMCopyData(var Msg: TWMCopyData);
var
lWhere : integer;
lLocation : string;
begin
lWhere := Msg.CopyDataStruct.dwData;
lLocation := String(PChar(Msg.CopyDataStruct.lpData));
if lWhere = 0 then
LabelVan.Caption := lLocation
else
LabelNaar.Caption := lLocation;
end;
希望这会对你有所帮助。
答案 13 :(得分:0)
您可以将文本文件中的文本读入字符串,如下所示
string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
str = str + sr.ReadLine();
}
答案 14 :(得分:0)
public partial class Testfile : System.Web.UI.Page
{
public delegate void DelegateWriteToDB(string Inputstring);
protected void Page_Load(object sender, EventArgs e)
{
getcontent(@"C:\Working\Teradata\New folder");
}
private void SendDataToDB(string data)
{
//InsertIntoData
//Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=kannan;Data Source=jaya;
SqlConnection Conn = new SqlConnection("Data Source=aras;Initial Catalog=kannan;Integrated Security=true;");
SqlCommand cmd = new SqlCommand();
cmd.Connection = Conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into test_file values('"+data+"')";
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
private void getcontent(string path)
{
string[] files;
files = Directory.GetFiles(path, "*.txt");
StringBuilder sbData = new StringBuilder();
StringBuilder sbErrorData = new StringBuilder();
Testfile df = new Testfile();
DelegateWriteToDB objDelegate = new DelegateWriteToDB(df.SendDataToDB);
//dt.Columns.Add("Data",Type.GetType("System.String"));
foreach (string file in files)
{
using (StreamReader sr = new StreamReader(file))
{
String line;
int linelength;
string space = string.Empty;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
linelength = line.Length;
switch (linelength)
{
case 5:
space = " ";
break;
}
if (linelength == 5)
{
IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line + space, null, null);
}
else if (linelength == 10)
{
IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line , null, null);
}
}
}
}
}
}
答案 15 :(得分:0)
我对一个2Mb csv的ReadAllText和StreamBuffer进行了比较,看起来差异非常小,但ReadAllText似乎占据了完成函数所用时间的优势。