[C#] C #을 사용하여 전체 파일을 문자열로 읽는 방법은 무엇입니까?

텍스트 파일을 문자열 변수로 읽는 가장 빠른 방법은 무엇입니까?

개별 바이트를 읽은 다음 문자열로 변환하는 등 여러 가지 방법으로 수행 할 수 있음을 이해합니다. 최소한의 코딩으로 방법을 찾고있었습니다.



답변

방법에 대해 File.ReadAllText:

string contents = File.ReadAllText(@"C:\temp\test.txt");


답변

의 벤치 마크 비교 File.ReadAllLinesStreamReader 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.ReadAllTextStreamReader.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;
}


답변

string contents = System.IO.File.ReadAllText(path)

MSDN 설명서 는 다음과 같습니다.


답변

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 %의 시간이 추가로 걸렸습니다.

StreamReaderFileStream그렇지 않으면 줄 바꿈을 찾고 있습니다. 이것은 여분의 시간 중 일부를 설명합니다.

추천

애플리케이션이 데이터 섹션과 관련하여 수행해야하는 작업에 따라 추가 처리 시간이 필요한 추가 구문 분석이있을 수 있습니다. 파일에 데이터 열이 있고 행이 CR/LF구분 되는 시나리오를 고려하십시오 . 는 StreamReader를 찾고 텍스트의 줄 아래로 일하는 것이 CR/LF, 다음 응용 프로그램은 데이터의 특정 위치를 찾고 추가 분석을 할 것입니다. (문자열이라고 생각 했습니까? SubString은 가격이 없습니까?)

반면에 FileStream, 데이터는 청크로 데이터를 읽으며 사전 개발자는 스트림을 사용하여 자신의 이익을 얻기 위해 조금 더 논리를 작성할 수 있습니다. 필요한 데이터가 파일의 특정 위치에있는 경우 이는 메모리 사용량을 줄이면서 진행할 방법입니다.

FileStream 속도를위한 더 나은 메커니즘이지만 더 많은 로직을 사용합니다.