Enig verschil tussen File.ReadAllText() en het gebruik van een StreamReader om de bestandsinhoud te lezen?

Eerst gebruikte ik een StreamReaderom tekst uit een bestand te lezen:

StreamReader reader = new StreamReader(dialog.OpenFile());
txtEditor.Text = reader.ReadToEnd();

maar ontdekte File.ReadAllTextwat mijn code lijkt te vereenvoudigen tot 1 regel. Zijn er verschillen tussen de twee? Wanneer moet ik de een boven de ander gebruiken?

txtEditor.Text = File.ReadAllText(dialog.FileName);

Antwoord 1, autoriteit 100%

Er zijn geen verschillen als je de ReadToEnd()methode gebruikt. Het verschil is als je de methode ReadLine()gebruikt voor grote bestanden, omdat je niet het hele bestand in het geheugen laadt, maar je in staat stelt het in stukjes te verwerken.

Gebruik dus File.ReadAllText()in plaats van ReadToEnd()omdat het je code korter en leesbaarder maakt. Het zorgt ook voor het correct weggooien van bronnen, zoals u misschien zou vergeten met een StreamReader(zoals u deed in uw fragment).


Antwoord 2, autoriteit 44%

Kijkend naar de code in mscorlib, roept File.ReadAllText StreamReader.ReadToEnd intern aan!

[SecurityCritical]
private static string InternalReadAllText(string path, Encoding encoding, bool checkHost)
{
    string result;
    using (StreamReader streamReader = new StreamReader(path, encoding, true, StreamReader.DefaultBufferSize, checkHost))
    {
        result = streamReader.ReadToEnd();
    }
    return result;
}

Antwoord 3, autoriteit 36%

Als je ReadToEndgebruikt, zijn ze hetzelfde. Anders kunt u met behulp van de StreamReaderbytes tegelijk lezen, er wat berekeningen mee doen en ze vervolgens weggooien als dat nodig is. Als u bijvoorbeeld een bestand had met een lijst van 2000 nummers en u wilt deze bij elkaar optellen, kunt u:

  • Bel File.ReadAllTextom alles in een string te lezen en vervolgens die string te ontleden om de som te berekenen.
  • Ofu kunt een StreamReadermaken en een paar bytes tegelijk lezen, terwijl u de som berekent.

Het belangrijkste verschil tussen deze twee benaderingen is het tijdelijke geheugengebruik. Nadat je de som hebt, kun je altijd alle tussentijdse gegevens weggooien. In de File.ReadAllText-benadering had je op een gegeven moment de volledige bestandsinhoud in het geheugen, terwijl je met de StreamReader-benadering slechts een paar bytes aan bestandsinhoud in geheugen op elk moment. Dit kan een probleem zijn, afhankelijk van de grootte van je bestanden en het soort berekening dat je doet.

File.ReadAllTextis handig en snel. StreamReaderis krachtig maar meer werk.


Antwoord 4, autoriteit 2%

Als je File.ReadAllTextgebruikt om een ​​onbeheerd logbestand te lezen (controle door fstream), bel dan File.ReadAllText, er zal IO.Exception:

Het bestand wordt beheerd door een ander proces

U moet StreamReader ReadToEndgebruiken om het te vervangen.

Other episodes