itk:p2 f8

30
ITK:P2 F8 Strömmar och filhantering DSV Peter Mozelius

Upload: isanne

Post on 19-Mar-2016

68 views

Category:

Documents


0 download

DESCRIPTION

ITK:P2 F8. Strömmar och filhantering. DSV Peter Mozelius. I/O. I/O = I nput / O utput Input = inmatning till en process från en fil, ett tangentbord eller från en annan process Output = utmatning från en process till en fil, en skärm, en skrivare, eller till en annan process. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ITK:P2   F8

ITK:P2 F8

Strömmar och filhantering

DSV Peter Mozelius

Page 2: ITK:P2   F8

I/O I/O = Input /Output Input = inmatning till en process

från en fil, ett tangentbord eller från en annan process

Output = utmatning från en process till en fil, en skärm, en skrivare, eller till en annan process

Page 3: ITK:P2   F8

Strömmar Oavsett typ av I/O så sker den i Java med

hjälp av strömmar En ström i Java är:

Ett flöde av data (binär eller som text) Ett objekt som hämtar data från en källa – inström Ett objekt som levererar data till en destination

– utström Poängen är att data behandlas lika oavsett vad som är källa eller destination

Page 4: ITK:P2   F8

Strömmar För att få tillgång till olika typer av

strömmar i Java: import java.io.*;

En djungel av strömtyper byte-strömmar char-strömmar

Page 5: ITK:P2   F8

Byte-strömmaro Dataflödet sker i form av byteso Har funnits i Java sedan JDK 1.0o Den inbyggda datatypen byteo 1 byte = 8 bitar

Alla klasser i Java som hanterar byte-strömmar har ett klassnamn där ordetStream ingår

Page 6: ITK:P2   F8

Char-strömmaro Dataflödet sker i form av charo Har funnits i Java sedan JDK 1.1o Den inbyggda datatypen charo 1 char = 16 bitar

Alla klasser i Java som hanterar char-strömmar har ett klassnamn där ordetReader eller Writer ingår

Page 7: ITK:P2   F8

Två olika filtyper Alla filer lagras som 1:or och 0:or

Binärfiler Läses just som en rad 1:or och 0:or Effektiv läsning för olika program

Textfiler Läses som en rad av tecken Trevlig läsning för oss människor

Page 8: ITK:P2   F8

Utström till fil 1 Öppna en 8-bitars byte-ström FileOutputStream fout = new FileOutputStream(”minfil.txt”);

Buffrad utmatning genom BufferedOutputStream bout =

new BufferedOutputStream(fout);

Page 9: ITK:P2   F8

The Decorator Design Pattern Ett av många designmönster Ett enkelt designmönster där koden

från förra bilden kan skrivas om enligt:

BufferedOutputStream bout = new BufferedOutputStream(new

FileOutputStream(”minfil.txt”));

Page 10: ITK:P2   F8

The Decorator Design Pattern En FileOutputStream kan dekoreras för

kryptering enligt: ObjectOutputStream ous = new ObjectOutputStream( new CipherOutputStream( new FileOutputStream(fil), cipher));

Poängen är att klasser inom samma familj kan kedjasihop dynamiskt och ytterligare klasser inte behövs

Page 11: ITK:P2   F8

Utström till fil 2 Öppna en 16-bitars char-ström till

en textfil och skriv med metoden println() lika enkelt som på P1 med

System.out.println();

PrintWriter pw = new PrintWriter( new FileOutputStream(”minfil.txt”)); OCH SEDAN pw.print(); ELLER pw.println();

Page 12: ITK:P2   F8

PrintWriter Klassen PrintWriter

Innehåller metoderna print() println()

Skriver ut med 16 bitar

Vi ska titta på ett kodexempel

MEN först 15 min PAUS!

Page 13: ITK:P2   F8

Att skriva till fil, exempel1import java.io.*;

public class F8_exempel1 { public static void main(String[] args) { PrintWriter pout = null; try { pout = new PrintWriter(new FileOutputStream("min.fil")); }catch (FileNotFoundException fnfe) { System.err.println("Angiven fil kunde inte öppnas."); System.exit(0); }

Page 14: ITK:P2   F8

Att skriva till fil, exempel1 Om filen min.fil redan finns och har

ett innehåll så kommer innehållet att skrivas över

Ibland är detta precis vad man vill Men ibland är det önskvärt att det

tidigare innehållet ska finnas kvar

Page 15: ITK:P2   F8

Att skriva till fil, exempel2 try{ pout = new PrintWriter(new FileOutputStream("min.fil", true)); } catch (FileNotFoundException fnfe) { System.err.println("Angiven fil kunde inte öppnas"); System.exit(0); }

Det som skrivs läggs till sist i filen

Page 16: ITK:P2   F8

Att skriva ut objekt Att dela upp komplexa objekt i sina

beståndsdelar och skriva ut del för del till en fil kan kräva mycket kod

I Java finns inbyggd serialisering Om en klass bara implementerar

interfacet Serializable Så kan hela objektet istället skrivas

ut på en gång med writeObject()

Page 17: ITK:P2   F8

Att skriva ut objekt Även en datasamling med ett antal

objekt kan skrivas ut i sin helhet:

ArrayList al = new ArrayList(); Lägg in en massa objekt; out.writeObject(al);

Där out är en instans av klassen java.io.ObjectOutputStream

Page 18: ITK:P2   F8

Att läsa in objekt Att sedan läsa in de utskrivna

objekten igen görs genom:

ObjectInputStream oin = new ObjectInputStream( new FileInputStream(fil)); OCH sedan oin.readObject()

Page 19: ITK:P2   F8

Klassen ObjectOutputStream

Klassen ObjectOutputstream har även en del andra instansmetoder för enklare utskrifter som t ex:

public void writeBoolean(boolean b); public void writeChars(String str); public void writeFloat(float f); public void writeDouble(double d);

Page 20: ITK:P2   F8

RandomAccessFile Den filåtkomst vi hittills tittat på har

varit sekventiell För vissa tillämpningar är det bättre

med direktåtkomst (random access)

Page 21: ITK:P2   F8

RandomAccessFileRandomAccessFile raf = new RandomAccessFile(”lager.fil”, ”rw”);

Skapar en direktaccessfil som det går att både läsa och skriva till

Flytta sedan inom filen med raf.seek();

15 min PAUS!

Page 22: ITK:P2   F8

En meny för filinläsning I program med grafiskt gränssnitt

vill man ofta ha menyer i stil med

Page 23: ITK:P2   F8

En meny för filinläsning Menyval kan som i kursbokens kap

14 skapas enligt:

public JMenuBar skapaArkivMeny() { filBar = new JMenuBar(); arkivMeny = new JMenu("Arkiv"); arkivMeny.setMnemonic('a'); filBar.add(arkivMeny);

Page 24: ITK:P2   F8

En meny för filinläsningMenyerna behöver också lyssnas avMenuListener ml = new MenuListener(this, meddelandeRuta, infoRuta); mItem = arkivMeny.add( new JMenuItem("Öppna", 'ö')); mItem.addActionListener(ml); mItem = arkivMeny.add( new JMenuItem("Avsluta", 'a')); mItem.addActionListener(ml);

Page 25: ITK:P2   F8

En meny för filinläsningMenylyssnaren är en egendefinierad klass som implementerar interfacet ActionListener

class MenuListener implements ActionListener {

med vår gamle vän public void actionPerformed( ActionEvent e) {

Page 26: ITK:P2   F8

En dialog för att välja fil JFileChooser fc = new JfileChooser(); int val = fc.showOpenDialog(fönster);

Page 27: ITK:P2   F8

Användarens filval Att användaren verkligen har valt

en fil och inte avbrutit dialogen kan kontrolleras genom:

if(val == JFileChooser.APPROVE_OPTION)

Sedan inleds filinläsningen med: BufferedReader inFil = null; try {

Page 28: ITK:P2   F8

Att läsa in vald fil inFil = new BufferedReader(new FileReader(jfc.getSelectedFile())); String rad; while((rad = inFil.readLine())!= null) meddelande += "\n" + rad;

}catch(FileNotFoundException fnfe){…}catch (IOException e){…}

Page 29: ITK:P2   F8

Ett egendefinierat filfilter Det kan vara praktiskt att filtrera bort de

filtyper som man INTE vill läsa in:

private class InFilter extends javax.swing.filechooser.FileFilter { public boolean accept(File f) { if(f.getName().toLowerCase().endsWith(".fil")) return true; else return false; } ...

Page 30: ITK:P2   F8

Er inlämningsuppgift Jobba nu på med:

Tack för idag!