답변:
방법에 대해 File.ReadAllText
:
string contents = File.ReadAllText(@"C:\temp\test.txt");
StreamReader.ReadToEnd
더 효율적입니다.
StreamReader.ReadToEnd
가보다 효율적 ReadAllLines
입니다. 후자는 텍스트를 여러 줄로 나눕니다. 그러나 우리는 다른 방법에 대해 이야기하고 ReadAllText
있습니다. 실제로 당신이 언급 한 답변 ReadAllText
은 StreamReader.ReadToEnd
내부적으로 전화 하는 것을 보여줍니다 .
의 벤치 마크 비교 File.ReadAllLines
대 StreamReader ReadLine
에서 C #을 파일 처리
결과. StreamReader는 10,000 줄 이상인 큰 파일의 경우 훨씬 빠르지 만 작은 파일의 차이는 무시할 수 있습니다. 항상 그렇듯이 다양한 크기의 파일을 계획하고 성능이 중요하지 않은 경우에만 File.ReadAllLines를 사용하십시오.
는 AS File.ReadAllText
접근 방식이 다른 사람에 의해 제안되었다, 당신은 또한 시도 할 수 있습니다 빨리 (내가 테스트하지 않았습니다 정량적 성능에 미치는 영향을하지만보다 빠른 것으로 보인다 File.ReadAllText
(참조 비교 ) 아래). 차이 성능하지만 단지 큰 파일의 경우에 볼 수 있습니다.
string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
readContents = streamReader.ReadToEnd();
}
를 통해 나타내는 코드보기 ILSpy 나는에 대해 다음과 같은 발견을 File.ReadAllLines
, File.ReadAllText
.
File.ReadAllText
- StreamReader.ReadToEnd
내부적으로 사용File.ReadAllLines
-또한 읽기 행으로 리턴하고 파일 끝까지 반복 StreamReader.ReadLine
하도록 List<string>
to 를 작성하는 오버 헤드가 추가로 내부적으로 사용 됩니다.
따라서 두 방법 모두 위에 구축 된 편의성 의 추가 계층 입니다 StreamReader
. 이것은 방법의 지시체에 의해 명백하다.
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;
}
File.ReadAllText
??
File.ReadAllText()
단순히 랩퍼라고 제안합니다 StreamReader.ReadToEnd()
. 추가 레이어가보다 약간 느리게 수행되어야한다고 생각합니다 StreamReader.ReadToEnd()
.
ReadAllText
것은 단지 래퍼 인 경우 속도에 큰 차이가있는 이유는 무엇 streamReader.ReadToEnd();
입니까?
File.ReadAllText () 메소드를 살펴보십시오.
몇 가지 중요한 말 :
이 메서드는 파일을 열고 파일의 각 줄을 읽은 다음 각 줄을 문자열의 요소로 추가합니다. 그런 다음 파일을 닫습니다. 줄은 일련의 문자 다음에 캐리지 리턴 ( '\ r'), 줄 바꿈 ( '\ n') 또는 캐리지 리턴 바로 다음에 줄 바꿈으로 정의됩니다. 결과 문자열에는 종료 캐리지 리턴 및 / 또는 줄 바꿈이 포함되지 않습니다.
이 방법은 바이트 순서 표시가 있는지에 따라 파일 인코딩을 자동으로 감지합니다. 인코딩 형식 UTF-8 및 UTF-32 (big-endian 및 little-endian)를 감지 할 수 있습니다.
인식 할 수없는 문자를 올바르게 읽을 수 없으므로 가져온 텍스트를 포함 할 수있는 파일을 읽을 때 ReadAllText (String, Encoding) 메서드 오버로드를 사용하십시오.
예외가 발생하더라도이 방법으로 파일 핸들을 닫을 수 있습니다.
System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
@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
, 다음 응용 프로그램은 데이터의 특정 위치를 찾고 추가 분석을 할 것입니다. (문자열이라고 생각 했습니까? SubString은 가격이 없습니까?)
반면에 FileStream
, 데이터는 청크로 데이터를 읽으며 사전 개발자는 스트림을 사용하여 자신의 이익을 얻기 위해 조금 더 논리를 작성할 수 있습니다. 필요한 데이터가 파일의 특정 위치에있는 경우 이는 메모리 사용량을 줄이면서 진행할 방법입니다.
FileStream
속도를위한 더 나은 메커니즘이지만 더 많은 로직을 사용합니다.
StreamReader.ReadToEnd
습니까?
당신이 사용할 수있는 :
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);
}
}
이 물건의 재미와 흥미를 찾을 수있다 밖으로 noobs에 대한 가장 빠른 방법은 (대부분의 경우 문자열로 전체 파일 읽기 이 벤치 마크에 따라 다음과 같은 것입니다) :
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 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 "";
}
}
이것이 도움이되기를 바랍니다.
다음과 같이 텍스트 파일에서 문자열로 텍스트를 읽을 수 있습니다.
string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
str = str + sr.ReadLine();
}
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);
}
}
}
}
}
}