텍스트 파일을 문자열 변수로 읽는 가장 빠른 방법은 무엇입니까?
개별 바이트를 읽은 다음 문자열로 변환하는 등 여러 가지 방법으로 수행 할 수 있음을 이해합니다. 최소한의 코딩으로 방법을 찾고있었습니다.
답변
방법에 대해 File.ReadAllText
:
string contents = File.ReadAllText(@"C:\temp\test.txt");
답변
의 벤치 마크 비교 File.ReadAllLines
대 StreamReader ReadLine
에서 C #을 파일 처리
결과. StreamReader는 10,000 줄 이상인 큰 파일의 경우 훨씬 빠르지 만 작은 파일의 차이는 무시할 수 있습니다. 항상 그렇듯이 다양한 크기의 파일을 계획하고 성능이 중요하지 않은 경우에만 File.ReadAllLines를 사용하십시오.
StreamReader 접근
는 AS File.ReadAllText
접근 방식이 다른 사람에 의해 제안되었다, 당신은 또한 시도 할 수 있습니다 빨리 (내가 테스트하지 않았습니다 정량적 성능에 미치는 영향을하지만보다 빠른 것으로 보인다 File.ReadAllText
(참조 비교 ) 아래). 차이 성능하지만 단지 큰 파일의 경우에 볼 수 있습니다.
string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
readContents = streamReader.ReadToEnd();
}
File.Readxxx ()와 StreamReader.Readxxx ()의 비교
를 통해 나타내는 코드보기 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 () 메소드를 살펴보십시오.
몇 가지 중요한 말 :
이 메서드는 파일을 열고 파일의 각 줄을 읽은 다음 각 줄을 문자열의 요소로 추가합니다. 그런 다음 파일을 닫습니다. 줄은 일련의 문자 다음에 캐리지 리턴 ( ‘\ r’), 줄 바꿈 ( ‘\ n’) 또는 캐리지 리턴 바로 다음에 줄 바꿈으로 정의됩니다. 결과 문자열에는 종료 캐리지 리턴 및 / 또는 줄 바꿈이 포함되지 않습니다.
이 방법은 바이트 순서 표시가 있는지에 따라 파일 인코딩을 자동으로 감지합니다. 인코딩 형식 UTF-8 및 UTF-32 (big-endian 및 little-endian)를 감지 할 수 있습니다.
인식 할 수없는 문자를 올바르게 읽을 수 없으므로 가져온 텍스트를 포함 할 수있는 파일을 읽을 때 ReadAllText (String, Encoding) 메서드 오버로드를 사용하십시오.
예외가 발생하더라도이 방법으로 파일 핸들을 닫을 수 있습니다.
답변
string text = File.ReadAllText("Path");
하나의 문자열 변수에 모든 텍스트가 있습니다. 각 줄이 개별적으로 필요한 경우 다음을 사용할 수 있습니다.
string[] lines = File.ReadAllLines("Path");
답변
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
속도를위한 더 나은 메커니즘이지만 더 많은 로직을 사용합니다.