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.
Alla olevissa esimerkeissä kirjoitetaan tiedostoon tekstimuotoista tietoa ja demonstroidaan samalla poikkeuksien käsittelyä.
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.
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
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.
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.
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).
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.
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.
Alla olevissa esimerkeissä luetaan tekstia tiedostosta ja demonstroidaan samalla poikkeuksien käsittelyä.
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
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ä.
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 voidaan sarjallistaa käyttämällä [Serializable]-määrettä luokan edessä. Tällöin Person-luokan oliot toteuttavat sarjallistamisen ja ne voidaan kirjoittaa tiedostoon.
Pääohjelmassa luodaan olio Person-luokasta, kirjoitetaan ja luetaan levyltä.
Esimerkkitulostus:
Jukka Husso
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ä
File and Stream I/O (C# Programming Guide)
Serialization (C# Programming Guide)