Home Page Home Page Articoli TextReader e TextWriter

TextReader e TextWriter

Una panoramica su come utilizzare queste due classi che ci permettono di leggere e scrivere file di testo.
Autore: David De Giacomi Livello:
Sappiamo tutti che appena il numero delle righe delle nostre applicazioni comincia ad aumentare c'è anche la necessità di scaricare dati e/o configurazioni sul disco fisso.
Come creare quindi dei file su disco?
Ci vengono in aiuto diverse classi del Framework, ognuna ottimizzata in base al tipo di dati che scriveremo, contraddistinte da una parola finale che può essere Reader relativa alle classi che permettono la lettura dei file o Writer quelle che invece permettono la scrittura.


  • TextReader / TextWriter

  • (per la lettura di una sequenza di Byte, di solito si usa per file di tipo testo)

  • BinaryReader / BinaryWriter

  • (è una lettura di tipo Raw, leggi direttamente i Byte e li inserisce in array di byte, si usa solitamente per caricare per esempio immagini, video, audio, ecc.)

  • StreamReader / StreamWriter

  • (è una classe derivata dalla TextReader/Writer e permette di leggere stream (sequenze) di byte con una codifica specifica (es. ANSI, Unicode, UTF8, ecc.)

  • StringReader / StringWriter

  • (anch'essa derivata dalla TextReader/Writer permette la scrittura di byte all'interno di stringhe facendo uso della classe StringBuilder ottimizzata quando bisogna fare operazioni di inserimento, eliminazione, ecc.)

    Come indicato dal titolo andremo ad esaminare le prime due classi dell'elenco qui sopra: TextReader e TextWriter.

    Come creare un file?
    E' un'operazione semplicissima ci servirà per gli esempi successivi, ma prima di cominciare, ricordiamo che queste classi sono contenute nel namespace System.IO, quindi per poterle utilizzare sarà necessario richiamare il namespace come solito:


    using System.IO;


    Queste due righe di codice non fanno altro che creare un file vuoto su C: chiamato output.txt e chiudere il file rilasciando gli handle (il file è così libero, e può essere utilizzato da altri processi, applicazioni, in caso contrario avrebbe avuto un lock e ogni operazione veniva bloccata).


    FileStream fs=File.Create("C:\\output.txt");
    fs.Close();


    Con TextWriter aggiungiamo del testo al nostro file.
    Il file di testo è stato creato ora utilizziamo la classe TextWriter per scrivere:


    TextWriter tw=File.AppendText("C:\\output.txt");
    tw.WriteLine("1° riga");
    tw.WriteLine("2° riga");
    tw.WriteLine("3° riga");
    tw.WriteLine("4° riga");
    tw.Close();


    Come potete notare nella prima riga il file viene aperto in modalità Append ossia tutto le righe di testo che verranno aggiunte finiranno in coda al file.
    Dalla seconda alla quinta riga utilizziamo il metodo WriteLine che scrive fisicamente i byte di testo sul file e inserisce un CRLF (\r\n) al termine della riga.
    Per chi volesse gestire manualmente i ritorni a capo è possibile usare il semplice metodo Write.
    Questi due metodi hanno molti overloads ed è possibile dare come parametri qualsiasi tipo di dato base (come int, float, decimal, object, array di char, stringhe con parametri, ecc.)
    Come ultima riga c'è la chiusura del TextWriter. E' molto importante non lasciare aperti, ciò significherebbe lasciare Handle a livello di OS aperti sul file e potrebbe causare comportamenti indesiderati nell'applicazione oppure blocchi con eccezioni.

    Leggiamo il file con TextReader
    Ci prepariamo ora ad affrontare il percorso contrario e cioè leggere il file.
    Il codice necessario per questa operazioni è il seguente:


    string riga="";
    TextReader tr=File.OpenText("C:\\output.txt");

    do
    {
    riga=tr.ReadLine();
    Console.WriteLine(riga);
    } while (riga!=null);

    tr.Close();


    Anche in questo caso le righe di codice necessarie sono veramente poche.
    Abbiamo creato una stringa (riga) di supporto e inizializzata.
    Viene aperto in lettura in modalità testo (File.OpenText) UTF-8 il file output.txt.
    Poi c'è un ciclo do while che legge una ad una le stringhe e le scrive a Console fino a quando il puntatore al file non giunge o supera la fine.
    In ultima riga, la chiusura del TextWriter come fatto in precedenza.

    Metodi per la lettura con TextReader
    E' bene sottolineare che per leggere un file sono disponibili diversi metodi e diverse modalità.
    Le elenco qui di seguito:


    • Read (legge un carattere e avanza il puntatore al carattere successivo)


    • Readline (legge una riga intera fino a quando incontra un CRLF)


    • ReadBlock (legge uno specifico numero di caratteri e li scrive in un buffer)


    • ReadToEnd (legge l'intero file e lo riversa in una stringa)




    Usiamo contemporaneamente TextReader e TextWriter!
    Per terminare l'articolo volevo solo proporvi un esempio molto utile per comprendere totalmente il funzionamento di queste classi e le possibilità che offrono e unificare i tre esempi utilizzati precedentemente.
    Con questo esempio si crea esattamente una copia identica di un file. E' più o meno il funzionamento della funzione copy dell'MS-DOS.


    //Crea un secondo file output2.txt
    FileStream fs=File.Create("C:\\output2.txt");
    fs.Close();

    //Inizializzazione e apertura dei due file
    TextReader tr=File.OpenText("C:\\output.txt");
    TextWriter tw=File.AppendText("C:\\output2.txt");

    string riga=""; //Stringa di supporto, funzionerà da buffer
    do
    {
    riga=tr.ReadLine(); //Legge la riga dal file output.txt
    tw.WriteLine(riga); //Scrive la riga appena letta nel file output2.txt
    } while (riga!=null);

    //Chiusura dei due file, liberiamo gli handles
    tr.Close();
    tw.Close();


    Il codice di questo esempio è disponibile per lo scaricamento sia in linguaggio C# che in VB.NET

    N.B. E' possibile che il file output2.txt sia più grande del primo di due byte. Cioè deriva dal fatto che è presente un CRLF in più visto che durante la scrittura del file bisognerebbe controllare che il contenuto della stringa riga non sia null, oppure impostare il ciclo diversamente.
    Ho scelto questo modo per lasciare il codice più pulito è utilizzare il minimo indispensabile.
    Voto medio articolo: 4.6 Numero Voti: 31

    File allegati


    David De Giacomi

    David De Giacomi

    MVP Program Logo Approda al mondo dell'informatica nell' Aprile del 1994. Un amico gli fa conoscere il Quick Basic del DOS. E' cosi che inizia la sua attività di sviluppatore. Prosegue il suo percorso con altri linguaggi (Visual Basic, Pascal, Java, ANSI C), fino ad arrivare a .NET. Per un certo periodo affianca all'attività ... Profilo completo

    Articoli collegati

    Utilizzare NUnit per testare codice .NET
    Scopriamo in questo articolo come utilizzare il popolare framework Open Source NUnit per effettuare Unit Testing del codice .NET aumentandone la qualità e riducendo il numero di eventuali bugs.
    Autore: Michela Zangarelli | Difficoltà:
    SQL Injection, che cosa è e come difendersi
    I malintenzionati sono sempre dietro l'angolo. Il SQL Injection è una delle pratiche più semplici da utilizzare per attaccare un'applicazione poco sicura e violarla o arrecare danni al database. Vediamo che cos'è e come garantire la sicurezza delle applicazioni in modo adeguato.
    Autore: Alessandro Alpi | Difficoltà: | Commenti: 4
    Visual Studio 2005 Team System
    Scopriamo il nuovo IDE di sviluppo che copre interamente l'intero ciclo di vita del software integrando in un solo ambiente più prodotti e studiato apposta per i ruoli di Architect, Developer e Tester.
    Autore: Marco Caruso | Difficoltà: | Voto:
    Tutorial ADO.NET ed esempi pratici - Parte 2
    Dopo aver fatto un po' di teoria su ADO.NET nella Parte 1 dell'articolo procediamo con un Tutorial pratico che ci condurrà alla creazione di un'applicazione basilare che consenta l'accesso e la modifica dei dati su un Database Access.
    Autore: Stefano Passatordi | Difficoltà: | Commenti: 10
    Introduzione ad ADO.NET - Parte 1
    ADO.NET è uno dei componenti chiave del .NET Framework. Eredita il nome dal vecchio ADO ma è praticamente quasi tutto cambiato. Una nuova architettura, nuovi concetti, nuove funzionalità e nuovi oggetti. Vediamo quali sono e a cosa servono.
    Autore: Stefano Passatordi | Difficoltà: | Commenti: 6
    Colonne calcolate e parola "Child" con ADO.NET
    Una cosa utile di ADO.NET e' la possibilita di aggiungere ad una colonna da codice il cui valore sia il risultato di operazioni sui dati dei record (o tra valori di altre colonne). Quando si utilizza un dataset con piu tabelle collegate mediante relazioni invece, usando la parola chiave "child" si possono avere delle informazioni riguardanti le tabelle figlio, direttamente nei record della tabella
    Autore: Matteo Raumer | Difficoltà: | Voto:
    Usare degli indicatori di progresso con Query SQL
    Nell'articolo vediamo come sia possibile con un l'aiuto delle classi DataReader e Command di ADO.NET, mostrare un indicatore di progresso che indichi lo stato di avanzamento di una query SQL durante il fetching dei dati.
    Autore: Matteo Raumer | Difficoltà: | Voto:
    La crittografia e la classe Rijndael
    Vediamo come utilizzare una delle tante classi messe a disposizione dal .NET Framework per la crittografia dei dati. In particolare la classe Rijndael implementa un algoritmo di crittografia molto forte diventato famoso negli ultimi anni.
    Autore: David De Giacomi | Difficoltà:
    DES il famoso standard creato da IBM per la crittografia dei dati
    In questo articolo dimostreremo come crittografare dei file usando il .NET Framework e in particolare la classe DESCryptoServiceProvider che implementa l'ormai noto algoritmo di cifratura inventato da IBM negli anni 70 chiamato DES (Data Encryption Standard)
    Autore: David De Giacomi | Difficoltà: | Commenti: 2 | Voto:
    Cosa sono e come funzionano le funzioni ricorsive?
    Ecco tre esempi efficaci che vi spiegano come usare correttamente le funzioni ricorsive, per effettuare ricerche di file e cartelle all'interno del disco fisso, per ricostruire la struttura di un file XML oppure per svuotare determinati controlli in una Form.
    Autore: Matteo Raumer | Difficoltà: | Commenti: 2
    Costruire Console Applications con Visual Studio .NET
    Spiegheremo in questo articolo i passi base fondamentali per costruire Console Applications utilizzando Visual Studio .NET.
    Autore: David De Giacomi | Difficoltà: | Voto:
    Giochiamo un po' con il registro di Windows!
    Scopriamo uno degli elementi fondamentali del sistema operativo Windows e vediamo come è possibile accedervi tramite le classi offerte dal .NET Framework: Microsoft.Win32.Registry e Microsoft.Win32.RegistryKey
    Autore: David De Giacomi | Difficoltà: | Commenti: 1 | Voto:
    .NET Framework 1.1 Beta
    Una prima panormaica sulle novità offerte dal Framework 1.1 che sarà integrato nella prossima versione di Visual Studio .NET 2003.
    Autore: David De Giacomi | Difficoltà:
    Cosa posso costruire con Visual Studio .NET ?
    Un' introduzione sui vari tipi di progetto disponibili in Visual Studio dalle tipiche applicazioni Windows fino alle recenti applicazioni Web e agli innovativi Web Services.
    Autore: David De Giacomi | Difficoltà: | Commenti: 1
    Copyright © dotNetHell.it 2002-2017
    Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5