Lettura/scrittura da/su file di testo .txt

sabato 09 giugno 2007 - 19.06

cavalieredeltempo Profilo | Newbie

Salve a tutti, programmo da poco in C# ed ho un problema.
Devo prima leggere un intero documento di testo arbitrariamente grande e poi scriverne un altro.

In Java esistono stream per lo scambio efficiente di dati, in particolare BufferedReader e BufferedWriter che mettono a disposizione i metodi readLine e writeLine sfruttando implicitamente un buffer.
In C#, a quanto ho capito, esiste solamente la classe BufferedStream, che mette a disposizione il metodo Read(byte[] buffer, int offset, int length). Dato che lavoro su stringhe mi servirebbe invece un metodo ReadLine, che eviti però di accedere al disco ad ogni linea.

Mi sono chiesto se il metodo ReadLine della classe StreamReader non implementasse gia una lettura efficiente tramite buffer. Ma non ho trovato risposta da nessuna parte. Per caso qualcuno mi può illuminare sulla strada da seguire?

Grazie

munissor Profilo | Senior Member

Per leggere usa:

FileStream fs = File.OpenText("file.txt");
BufferedStream bf = new BufferedStream(fs);
StreamReader sr = new StreamReader(bf);


Per scrivere è analogo solo che devi aprire il file di testo in scrittura...

Ciao

cavalieredeltempo Profilo | Newbie

Caspita!
Non ci pensavo che gli stream si potevano concatenare in questo modo!
Peccato che ho gia sviluppato l'algoritmo utilizzando solo BufferedStream. Spero di trovare il tempo di applicare il tuo consiglio.

Grazie mille!

cavalieredeltempo Profilo | Newbie

FileStream fs = File.OpenText("file.txt");
BufferedStream bf = new BufferedStream(fs);
StreamReader sr = new StreamReader(bf);

In questo modo da errore, ma ci sono mille modi per correggerlo.
A tal proposito mi è venuto in mente un modo per utilizzare solo due stream:

FileStream fs = new FileStream("file.txt", FileMode.Open, FileAccess.Read, FileShare.None, bufferSize);
StreamReader sr = new StreamReader(fs );

O forse la presenza di quel bufferSize mi ha fatto prendere un granchio?

In effetti osservando il programma in esecuzione sul task manager, le prestazioni per quanto riguarda il consumo di memoria sono estremamente frustranti.
Per quanto mi ingegni ad usare buffer, a incapsulare gli stream in clausole using, a ridurre al minimo le strutture di appoggio .net continua a fare ciò che vuole della memoria. In pratica, nonostante abbia imposto l'uso di un massimo di 10 MB di memoria (tra buffers e strutture d'appoggio) la memoria oscilla imprevedibilmente tra i 20 e i 60 MB.

munissor Profilo | Senior Member

Devi considerare però anche l'utilizzo di RAM da parte del runtime.. Se devi ottimizzare la memoria in modo "pesante" devi utilizzare WinDbg e le estensioni SOS per vedere esattamente cosa è caricato dal tuo codice gestito e cosa invece è parte del runtime... In ogni caso se hai requisiti di memoria molto restrittivi conviene sempre il caro vecchio C++
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5