Datoteka (Java)

Iz MaFiRaWiki

(Preusmerjeno iz Datoteke v Javi)

Vsebina

Kaj je datoteka

Datoteka je zaporedje podatkov, ki so shranjeni na disku ali kakem drugem mediju (CD-ROM, disketa). V datotekah hranimo različne podatke: besedila, preglednice, slike, glasbo, programe,... Glej Datoteka Vse datoteke, ki so dostopne na računalniku, so organizirane v datotečni sistem. To je drevesna struktura, ki je sestavljena iz direktorijev ali map. Pri operacijskem sistemu Microsoft Windows je vsak datotečni sistem poimenovan s svojo črko. (A: za disketo, C: za disk, D: za CD-ROM,... Vsaka datoteka ima ime in je shranjena v mapi. Polno ime datoteke dobimo tako, da zložimo skupaj njeno ime in mapo.


PRIMER: Dana je datoteka blablabla.txt na disku C:, v mapi hopsasa, ki je v podmapi tralala. Polno ime datoteke je potem:

C:\tralala\hopsasa\blablabla.txt 

OPOMBA: Imena direktorijev vedno ločujemo z znakom \. Ko pa pišemo znak \ v Javi, pa moramo napisati dvojni \\. Preden lahko z datoteke beremo ali nanjo pišemo, jo moramo najprej odpreti. Glede na to, ali želimo iz datoteke brati podatke, ali pa vanjo pisati, jo odpremo bodisi za branje bodisi za pisanje.

Branje z datotek

Recimo, da želimo brati z datoteke besedilo.txt. Ker je Java objektni programski jezik, datoteko odpremo tako, da preprosto naredimo nov objekt ustreznega razreda:

FileReader d = new FileReader("besedilo.txt");

S tem smo naredili nov objekt d, ki bo sam odprl datoteko besedilo.txt. Z datoteke lahko nato beremo z metodo read(char[], int, int). V večini primerov želimo brati posamezne vrstice, česar pa metoda read ne omogoča. Zato običajno naredimo še en objekt razreda BufferedReader, ki ga nato uporabljamo za branje posameznih vrstic:

BufferedReader datoteka = new BufferedReader(d);

Objekt datoteka spada v razred BufferedReader, ki vsebuje metodo readLine() za branje ene vrstice. Oglejmo si uporabo datotek v celotnem programu. Napišimo program IzpisiDatoteko.java, ki prebere vrstice dane datoteke in jih izpiše na zaslon:

  1. import java.io.*;
  2. /*z zgornjim ukazom Javi povemo, da bomo uporabljali razrede in metode iz knjižnice java.io. Ta knjižnica vsebuje vse potrebno za delo z datotekami.*/
  3. public class IzpisiDatoteko {
  4. public static void main(String[] args) throws IOException {/*z ukazom throws IOException Javi povemo, da metoda main lahko vrže izjemo IOException, ki se lahko zgodi, če na primer hočemo odpreti datoteko, ki ne obstaja.*/
  5. //ime datoteke bomo dobili podano kot argument v ukazni vrstici:
  6. String ime = args[0]; // če je datoteka znana, lahko namesto args[0] kar navedemo njeno ime
  7. //Naredimo nov objekt razreda BufferedReader, ki ga bomo uporabljali za branje z datoteke:
  8. BufferedReader datoteka = new BufferedReader(new FileReader(ime));
  9. /*z metodo ready() preverimo, ali objekt datoteka vsebuje še kako vrstico za branje. Metoda ready() vrne true,če je v
  10. datoteki na voljo vrstica za branje, in false, če je datoteke že konec.*/
  11. while(datoteka.ready()) {
  12. /*z metodo readLine() preberemo naslednjo vrstico z datoteke.(to metodo lahko uporabljamo tudi za branje s standardnega vhoda.)*/
  13. System.out.println(datoteka.readLine());
  14. }
  15. //ko datoteke ne potrebujemo več, jo zapremo z metodo close():
  16. datoteka.close();
  17. }}

Če imamo datoteko z imenom "bla" shranjeno na C-disku v mapi "Racunalnistvo", potem jo v ukazni vrstici pokličemo z naslednjim ukazom:

> java IzpisiDatoteko c:\\Racunalnistvo\\bla.txt

Pisanje v datoteke

Za pisanje na datoteko besedilo.txt naredimo objekt razreda FileWriter:

FileWriter d =  new FileWriter("bar.txt");

Tako kot pri branju z datotek je tudi pisanje na datoteko z objektom razreda FileWriter nepraktično. V praksi večkrat zasledimo objekt PrintWriter:

PrintWriter datoteka = new PrintWriter(d);

Objekt razreda PrintWriter vsebuje metodi println in print, ki ju uporabljamo za zapisovanje na datoteke, pa tudi za izpisovanje na zaslon.


PRIMER:

  1. import java.io.*;
  2.  
  3. public class ZapisiPesem {
  4. public static void main(String[] args) throws IOException {
  5.  
  6. String ime = args[0];
  7.  
  8. PrintWriter datoteka = new PrintWriter(new FileWriter(ime));
  9.  
  10. datoteka.println("Pesem, ki sem jo najraje pela, ko sem bila še majhna:");
  11. datoteka.println();
  12. datoteka.println("Na planincah sončece sije,");
  13. datoteka.println("na planincah sončece sije,");
  14. datoteka.println("na planincah sončece sije,");
  15. datoteka.println("na planincah luštno je!");
  16. /*Objekt datoteka je zapisal zgornje stavke na datoteko, katere ime bomo podali v ukazni vrstici. Če bi jih želeli
  17. izpisati na zaslon bi morali uporabiti metodo println() iz objekta System.out:
  18. Namesto datoteka.println(...) bi torej napisali: System.out.println(...)*/
  19.  
  20. /*ko končamo z zapisovanjem na datoteko, jo obvezno zapremo, sicer se lahko zgodi, da se
  21. podatki ne bodo pravilno zapisali:*/
  22. datoteka.close();
  23. }}

Če želimo zgornje stavke izpisati na datoteko z imenom "bla", shranjeno na C-disku v mapi "Racunalnistvo", potem to v ukazni vrstici naredimo z naslednjim ukazom:

> java ZapisiPesem c:\\Racunalnistvo\\bla.txt

Primerjanje datotek

Kako primerjamo med seboj dve datoteki?

Na začetku moramo definirati dva objekta tipa BufferedReader, saj bomo brali iz dveh datotek. Najprej bomo šli čez prvo datoteko in preverili, če se zaenkrat ujema z drugo. Če se, potem moramo iti še čez drugo datoteko, saj se lahko zgodi, da je le-ta lahko daljša. Uporabili bomo tip logičnih vrednosti "boolean", ki nam bo vrnil true, če sta datoteki enaki, in false sicer. OPOMBA: Če bomo stavek na datoteko napisali v eni vrstici, na drugo datoteko pa bomo isti stavek napisali tako, da bomo vsako besedo vnesli v svojo vrstico, ne moremo pričakovati, da bo program vrnil "true".


PRIMER:

  1. import java.io.*;
  2.  
  3. public class Primerjaj {
  4. public static void main(String[] args) throws IOException {
  5.  
  6. String ime1 = args[0];
  7. String ime2 = args[1];
  8.  
  9. BufferedReader datoteka1 = new BufferedReader(new FileReader(ime1));
  10. BufferedReader datoteka2 = new BufferedReader(new FileReader(ime2));
  11.  
  12. boolean enaki = true;
  13.  
  14. while(datoteka1.ready() && enaki) { //datoteki se zaenkrat ujemata
  15. String vrsta1 = datoteka1.readLine();
  16. if(datoteka2.ready()){ //2.datoteka še ni prazna
  17. String vrsta2 = datoteka2.readLine();
  18. enaki = vrsta1.equals(vrsta2);
  19. }
  20. else{
  21. enaki=false; //2. datoteka je krajša
  22. }}
  23. if(enaki){
  24. if(datoteka2.ready()){
  25. enaki=false;
  26. }}
  27. System.out.println(enaki);//v ukazni vrstici želimo odgovor, če sta datoteki enaki
  28. }}

Če želimo primerjati datoteko bla.txt (v mapi:"Racunalnistvo") z datoteko mat.txt (v mapi "Matematika"), to storimo v ukazni vrstici z ukazom:

> java Primerjaj c:\\Racunalnistvo\\bla.txt c:\\Matematika\\mat.txt

Program bo vrnil true, ce sta datoteki enaki in false, ce nista.

Kopiranje z ene datoteke v drugo

Ko želimo neko besedilo prekopirati iz ene datoteke na drugo, moramo najprej prebrati vsebino prve datoteke in nato določene stvari zapisati na drugo. Narediti moramo torej dva objekta, enega za branje (glej: "branje iz datotek") in drugega za pisanje (glej: "pisanje na datoteke"). V ukazno vrstico bomo torej podali torej najprej ime datoteke, iz katere bomo brali, nato pa še ime tiste, na katero želimo pisati. Na koncu ne smemo pozabiti obeh datotek zapreti.


PRIMER:

  1. import java.io.*;
  2.  
  3. public class Kopiraj {
  4.  
  5. public static void main(String[] args) throws IOException {
  6.  
  7. String ime1 = args[0];
  8. String ime2 = args[1];
  9.  
  10. PrintWriter dat2 = new PrintWriter(new FileWriter(ime2));
  11.  
  12. while(dat1.ready()) {
  13. //na datoteko dat2 prekopiramo vsebino datoteke dat1:
  14. dat2.println(dat1.readLine());
  15. }
  16. dat1.close();
  17. dat2.close();
  18. }}

Če želimo vsebino datoteke "bla" (ki je v mapi "Računalništvo") prekopirati v datoteko "mat" (ki je v mapi "Matematika"), to storimo v ukazni vrstici z ukazom:

> java Kopiraj c:\\Racunalnistvo\\bla.txt c:\\Matematika\\mat.txt

Obdelovanje podatkov v datotekah

V datoteki imamo podana cela števila, katerih vsoto želimo izračunati in jo izpisati v ukazno vrstico. Kako to storimo? Če bomo podajali cela števila, bo tudi vsota celo število, zato jo na začetku tudi tako definiramo. Da bi bil program napisan čim bolj enostavno, bomo pisali števila v datoteki vsakega v svojo vrsto.


PRIMER:

  1. import java.io.*;
  2. public class Sestej {
  3. public static void main(String[] args)throws IOException{
  4.  
  5. String ime = args[0];
  6.  
  7. BufferedReader datoteka = new BufferedReader(new FileReader(ime));
  8.  
  9. int vsota = 0;
  10.  
  11. while(datoteka.ready()){
  12. vsota = vsota + Integer.parseInt(datoteka.readLine());
  13. }
  14. datoteka.close();
  15. System.out.println(vsota);
  16. }}

Če želimo sešteti vrednosti na datoteki "bla" (ki je v mapi "Računalništvo"), to storimo v ukazni vrstici z ukazom:

> java Sestej c:\\Racunalnistvo\\bla.txt

Matrike v datotekah

Kako v datoteko shranimo matriko celih števil? Format zapisa: Prva vrstica v datoteki vsebuje število vrstic matrike, presledek (ali več) in nato število stolpcev matrike. V drugo vrstico podamo 1.vrstico matrike, v kateri so elementi, oziroma stolpci ločeni s presledki. V naslednji vrstici je 2.vrstica matrike in tako dalje...


PRIMER:

Matriko \begin{bmatrix} 1&1&1&1\\10&10&10&10\\100&100&100&100\end{bmatrix}


zapišemo:

v Javi:

int[][]matrika = {{1,1,1,1},{10,10,10,10},{100,100,100,100}};

na datoteko:

3 4
1 1 1 1
10 10 10 10
100 100 100 100


Brisanje in preimenovanje datotek

Če želimo datoteko izbrisati ali jo preimenovati, mora biti le-ta zaprta. Najprej ustvarimo nov objekt tipa File in sicer:

 File datoteka = new File("imeDatoteke.txt");

Če želimo datoteko izbrisati, sledi:

 datoteka.delite();

Če pa jo želimo preimenovati, moramo najprej ustvariti še en objekt tipa File:

 File datoteka2 = new File("imeDatoteke2.txt");
 datoteka.renameTo(datoteka2);

Osebna orodja