Tiedostoon kirjoittaminen

Windows-ympäristössä voidaan tiedostoon kirjoittaa useilla eri tavoilla ja sisällöllä riippuen siitä millaisessa kontekstissa ohjelmaa suoritetaan. Tässä vaiheessa opintojaksoa harjoittellaan tiedostoon kirjoittamista konsoliohjelmasta käsin. Opintojakson edetessä tutustutaan tiedostojen käsittelyyn myös graafisen käyttöliittymän sisältävien ohjelmien kautta.

Tarkoituksena on myös jatkaa poikkeuksien käsittelyjen toteuttamista ohjelmaan. Tiedostojen käsittelyn yhteydessä voi esiintyä useita erilaisia poikkeuksellisia tilanteita.

Tekstin kirjoittaminen tiedostoon

Alla olevissa esimerkeissä kirjoitetaan tiedostoon tekstimuotoista tietoa ja demonstroidaan samalla poikkeuksien käsittelyä.

Esimerkki: Tiedostoon kirjoittaminen 1

Kirjoitetaan tiedostoon, joka sijaitsee luodun projektin toteuttavan exe-tiedoston kanssa samassa kansiossa.


    

Tiedostoon kirjoittaminen ja sulkeminen onnistuu, jos mitään poikkeusta ei tapahdu. Jos kuitenkin poikkeuksia tapahtuu riveillä 4 tai 5, silloin tiedosto jää sulkematta.

Esimerkki: Tiedostoon kirjoittaminen 2

Kokeillaan kirjoittaa tiedostoon, joka on C:-aseman juuressa. Esimerkkitapauksessa C-asema on kirjoitussuojattu, jolloin ohjelmaa suoritettaessa aiheutuu UnauthorizedAccessException-tyyppinen poikkeus.


    

Ohjelman suoritus pysähtyy riville 3 ja aiheuttaa sovelluksessa UnauthorizedAccessException-tyyppisen poikkeuksen. (kuvakaappaus)

Yllä olevissa ohjelmointikoodeissa mahdolliset poikkeukset voivat aiheutua seuraavista ohjelmointikäskyistä, joten näiden metodien dokumentaatiota on tutkittava:

* StreamWriter()-konstruktori kutsusta : Exceptions
* WriteLine()-metodin käytöstä: Exceptions
* Close()-metodin käytöstä: Exceptions

Esimerkki: Tiedostoon kirjoittaminen 3

Alla olevassa esimerkissä on käsitelty muutamia poikkeuksia. Huomaan kuinka catch-lauseita voi olla useita, jos ohjelmassa halutaan eritellä mikä tietty poikkeuksellinen tilanne on tapahtunut.



    

Esimerkki: Tiedostoon kirjoittaminen 4

Yleisesti ei kuitenkaan ole tarve eritellä kaikkia poikkeuksia mitä voi tapahtua. Tällöin voidaan käyttää poikkeuksien Exception-yliluokkaa hoitamaan tilanne. Huomaa kuinka poikkeuksen käsittelijässä on otettu myös olio käyttöön, jota kautta poikkeukseen liittyvä viesti saadaan esitettyä käyttäjälle. Alla olevassa esimerkissä ohjelmaa on ajettu tilanteessa, jossa c-levyasema on ollut kirjoitussuojattu.


    
    

Esimerkki: Tiedostoon kirjoittaminen 5

Alla olevassa esimerkissä tiedosto kirjoitetaan käyttöjärjestelmässä olevaan "My Documents" -kansioon. Ohjelmoinnissa on käytetty myös using-lausetta, joka rajaa StreamWriter-luokan olion näkymään ja toimimaan ainoastaan using-lauseen määrittämien {}-sulkujen sisälle. Tämän jälkeen sille kutsutaan automaattisesti Dispose()-metodia, joka vaputtaa ko. olion käyttämät resurssit välittömästi. Objekti on myös "read-only" tilassa ja siihen siis voida enää tehdä määrittelyjä, vaan sitä voidaan ainoastaan käyttää (using).


    
    

Esimerkki: Tiedostoon kirjoittaminen 6

Tässä esimerkissä esitellään tekstin kirjoittamista tiedostoon WriteAllLines()-metodilla. Tiedosto kirjoitetaan käyttöjärjestelmässä olevaan "My Documents" -kansioon. WriteAllLines()-metodi tekee ko. tiedoston, kirjoittaa kokoelmana määritellyt merkkijonot tiedostoon omille rivilleen ja sulkee tiedoston.


    
    

Esimerkki: Tiedostoon lisääminen (kirjoittaminen) olemassa olevaan tiedostoon

File.AppendText-metodilla voidaan lisätä tekstiä olemassa olevaan tiedostoon. Tässä esimerkissä lisätään kolme tekstiriviä olemassa olevaan tekstitiedostoon. Tiedosto luodaan, jollei sitä ole.



    

Tekstin lukeminen tiedostosta

Alla olevissa esimerkeissä luetaan tekstia tiedostosta ja demonstroidaan samalla poikkeuksien käsittelyä.

Esimerkki: Tiedostosta lukeminen 1

Alla olevassa esimerkissä luetaan koko tekstitiedoston sisältö kerralla ja tulostetaan konsolille.


    

Esimerkkitulostus: (riippuu tiedoston sisällöstä)


    Contents of test.txt:
    First line
    Second line
    Third line
    

Esimerkki: Tiedostosta lukeminen 2

Alla olevassa esimerkissä luetaan koko tekstitiedoston sisältö kerralla string[]-taulukkoon ja käydään foreach()-lauseella läpi alkiokerrallaan.


    

Esimerkkitulostus on samanlainen kuin edellisessä esimerkissä.

Olioiden kirjoittaminen/lukeminen tiedostoon

Alla olevassa esimerkissä käydään läpi olion tallentaminen tiedostoon. Ohjelmasta on jätetty pois mahdollisten poikkeusten käsittely.

Ensimmäiseksi haluttu olio täytyy sarjallistaa, jotta se voidaan tallentaa tiedostoon. Sarjallistaminen (Serialization) on prosessi, jossa olion tiedot muutetaan tavumuotoiseksi virraksi (stream of byte), jotta ne voidaan siirtää tiedostoon. Päätarkoituksena on tallentaa olion tila, jotta se saadaan myöhemmin lukea takaisin ohjelman käyttöön siinä tilassa, jossa se tallennettaessa oli. Luettaessa olion tila muutetaan takaisin varsinaiseen oliomuotoon (Deserialization).

Person-luokka

Person-luokka voidaan sarjallistaa käyttämällä [Serializable]-määrettä luokan edessä. Tällöin Person-luokan oliot toteuttavat sarjallistamisen ja ne voidaan kirjoittaa tiedostoon.


    

Person-luokan käyttäminen

Pääohjelmassa luodaan olio Person-luokasta, kirjoitetaan ja luetaan levyltä.


    

Esimerkkitulostus:


    Jukka Husso
    

Useampien Person-luokan olioden tallentaminen/lukeminen

Useasti tulee tilanne, jossa pitää useampia luokan edustajia tallentaa/lukea levyltä. Tällöin voisi käyttää jotain toistorakennetta yhden olion kerrallaan kirjoittamiseen/lukemiseen levyltä. Onneksemme voimme kirjoittaa tietorakenteita levylle ja tätä kautta saada koko kokoelma kerralla levylle ja takaisin.


    

Esimerkkitulostus:


    Kirsi Kerneli
    Matti Konsoli
    Teppo Terävä
    

Lisätietoa

File and Stream I/O (C# Programming Guide)
Serialization (C# Programming Guide)