Chapter 11
Collections og streams

Kurt Nørmark ©
Department of Computer Science, Aalborg University, Denmark


September 2001


Abstract
Previous lecture Next lecture
Index References Contents
Vi har tidligere set på de basale datastrukturer arrays og lister, endog i en objekt-orienterede udgaver. I denne lektion starter vi med at se på en generalisering af arrays og lister, som kaldes Collections. Dette emne falder helt naturligt i forlængelse af forrige lektion om klassedesign.

Senere i lektionen studerer vi Java's hierarki af stream klasser.


Collections

Introduktion til collections
Slide Note Contents Index
References Speak

Collections repræsenterer forskellige former for samlinger af data

Java's Collection klasser udgør et alternativ til brug af "native Java arrays", klassen Vector, og klassen Hashtable

Collections udgør også et alternativ til tredie parts Java software, såsom JGL

Exercise 11.1. Klassen KortbunkeI forlængelse af opgaven om Spillekort fra en tidligere lektion vil vi i denne opgave programmere en klasse Kortbunke, som repræsenterer en bunke af kort. En instans af denne klasse kan bruges til at repræsentere et komplet spil kort ligesom den kan bruges til at repræsentere de kort, en spiller har på hånden.

Ideen med opgaven er at benytte en Java Collection klasse som grundlaget for implementationen. Overvej hvilken, og overvej om en Kortbunke skal udvide/specialisere en Collection klasse, være klient af en Collection klasse, eller blot implementere et Collection interface.

Vi ønsker at at kunne repræsentere en bestemt ordning mellem kortene, således at vi f.eks. kan tale om det øverste kort og det nederste kort.

Følgende operationer skal være mulige på instanser af Kortbunke (hverken flere eller færre):

  • Fjern og returner øverste kort.
  • Læg et nyt kort oven på bunken.
  • Læg et nyt kort nederst i bunken.
  • Returner om bunken er tom
  • Bland bunken tilfældigt.
  • Sorter bunken i 'naturlig orden' (lad os sige ruder før hjerter før klør før spar).
  • Returner en Iterator, som gennemløber kortene i bunken.

Datarepræsentationen skal være privat i klassen.

Det vil være hensigtsmæssigt at have følgende udvalg af konstruktorer:

  • En konstruktor som laver et tomt kortspil.
  • En konstruktor som laver et spil kort med bestemte, givne kort.
  • En konstruktor som laver et komplet spil kort (med 52 kort).

Overvej hvorledes du ønsker at skelne mellem disse tre konstruktorer parametermæssigt.

Exercise 11.2. Krig - et simpelt kortspilI forlængelse af opgaven om Spillekort og opgaven om Kortbunke vil vi i denne opgave programmere en applikation, som anvender et spil kort til at gennemføre et kortspil, som mange børn kalder 'Krig'

Spillet spilles af to spillere. I denne opgave spiller Computeren begge spillere. Der er altså tale om ultimativ effektivisering, idet vi nu kan spille Krig på under et sekund...

Kortene deles ligeligt mellem to spillere. Hver spiller har en bunke kort foran sig. Spillet går ud på at erobre alle modspillerens kort. Spillet forløber således:

Hver spiller tager det øverste kort. Den spiller, som har det største kort vinder begge kort. Vinderen lægger de vundne kort i bunden af sin bunke. Hvis to kort er af samme størrelse er der 'krig'. Hver spiller putter de to ens kort i en pulje, som forstørres med yderligere to kort fra hver spiller (øverst fra bunken). Dernæst sammenlignes de øverste kort fra de to resterende bunker igen, og den spiller der har det største vinder hele puljen. Er der igen lighed gentages krigen, med det resultat at puljen bliver større og større. Den spiller der først mister alle sine kort taber spillet.

Skriv programmet således at der bliver udskrevet et spor af spillet, der fortæller om hver duel og hver krig. Det er en fordel at man løbende kan se hvor mange kort hver spiller har tilbage.

References

Collection interfaces
Slide Note Contents Index
References Speak
Vi starter med et overblik over hierarkierne af Collection interfaces i Java

Collections er primært defineret gennem et hierarki af interfaces

Underliggende findes der typisk flere klasser, som implementerer de forskellig interfaces

Figure. De to bidrag til Collection hierarkierne i Java.

  • Fleksibilitet via interfaces

    • Programmer, som virker gennem interfaces, binder sig ikke til en bestemt implementation af en collection

    • Det er let at udskifte den underliggende collection klasse med en anden, som implementerer samme interface

References

Interfacet Collection
Slide Note Contents Index
References Speak
Vi starter med at studere det mest generelle interface i collection hierarkiet. Dette kaldes helt naturligt Collection

Interfacet Collection svarer til den datatype, vi ofte betegner som en bag

  • Operationelle karakteristika ved Collection interfacet

    • Operationer som tilføjer og fjerner enkelt elementer

      • add(Object), remove(Object)

    • Operationer som tilføjer, bibeholder, og fjerner samlinger af elementer

      • addAll(Collection), retainsAll(Collection), removeAll(Collection)

    • Operationer som undersøger om elementer er i samlingen

      • contains(Object), containsAll(Collection)

    • En operation som returnerer en iterator for samlingen

      • iterator()

    • Observator operationer for størrelse og tomhed

      • size(), isEmpty()

    • Bagud sammenligneligheds operationer, som konverterer til arrays

      • toArray(), toArray(Object[])

    • Andre operationer

      • clear(), equals(Object)

References

Interfacet Set
Slide Note Contents Index
References Speak
Vi fortsætter med at studere interfacet Set, som repræsenterer mængder.

Set modsvarer det matematiske mængde begreb

Der kan højst være én forekomst af et element i et Set objekt

Interfacet Set arver fra Collection, og er faktisk identisk med Collection

  • Opstramninger af Set i forhold til Collection:

    • Enhver konstruktor skal konstruere en Collection uden duplikater

    • Operationen add kan ikke tilføje elementer, som allerede er i mængden

    • Operationskaldet set1.equal(set2) virker som:

      • set1 er delmængde af set2 og set2 er delmængde af set1

    • Der er et detailkrav til operationen hashCode operationen

Set interfacet er stort set indentisk med Collection interfacet. Der er dog nogle stærkere krav til nogle af operationerne, eksempelvis kravet om at et element højst kan være repræsenteret én gang i et Set objekt. Vi kan sige, at invarianten af en klasser, som implementerer Set interfacet, er strammet.

Bemærk, at interfaces ikke specificerer konstruktorer.

Angående equal i Set og Collection: I Collections kan equal implementeres som Object equal, altså som ==. I Set har equal en mere element-orienteret betydning. To ikke-identiske mængde objekter set1 og set2 kan altså godt foranledige set1.equal(set2)

References

Klassiske mængedeoperationer
Slide Note Contents Index
References Speak
Vi ser her på, hvordan man kan realisere nogle af de klassiske mængde operationer ved brug af operationerne i interfacet Set

Interfacet Set indeholder ikke direkte de klassiske mængde operationer, såsom foreningsmængde, delmængde, og fællesmængde

Der kan dog anvises idiomer ved brug af hvilke, disse operationer kan realiseres

Nogle af disse idiomer giver destruktive operationer

  • Idiomer som modsvarer de mest almindelige operationer på mængder:

    • Foreningsmængde:

      • s1.addAll(s2)

    • Fællesmængde:

      • s1.retainAll(s2)

    • Delmængde:

      • s1.containsAll(s2)

    • Mængdedifferens:

      • s1.removeAll(s2)

Operationerne addAll, retainAll og removeAll ændrer på modtager objektets indhold. Vi kan sige, at resultatet af operationen overskriver s1 i eksemplerne. Dette er nok ikke altid det vi ønsker. Hvis ikke, skal vi sørge for at kopiere s1 inden vi kalder mængde operationen:

  • Set result = new HashSet(s1); result.addAll(s2)
Ovenstående viser hvordan vi putter foreningsmængden af s1 og s2 i mængden result, der skabes som en kopi af s1 ved brug af den constructor, der tager en Collection som parameter.

Reference

Klasserne HashSet og TreeSet
Slide Note Contents Index
References Speak
Vi ser nu på konkrete klasser i Java biblioteket, som implementerer interfacet Set.

Klasserne HashSet og TreeSet implementerer interfacet Set

HashSet garanterer ingen bestemt ordning på elementerne.

TreeSet garanterer at elementerne er ordnet i stigende orden.

TreeSet implementer faktisk et subinterface af Set, nemlig SortedSet. SortedSet kræver at elementerne i mængden implementerer Comparable grænsefladen. Vi ser på Comparable, element ordning og sortering senere i denne lektion. Bemærk at Comparable, som omtalt her, ikke er det samme som den abstrakte klasse Comparable, vi diskuterede i lektionen om klassedesign.

Ordningerne, som der er tale om, kommer til udtryk når vi returnerer en iterator på mængden via operationen iterator().

  • HashSet

    • Mængden er implementeret ved brug af en hashtabel

    • Add, remove og contains operationerne forventes at have konstant tidskompleksitet

    • Den mest effektive Set implementation i praksis

  • TreeSet

    • Mængden er implementeret som en træstruktur

    • Add, remove og contains operationerne garanteres at have logaritmisk tidskompleksitet

Når vi skriver, at HashSet operationerne har forventet konstant tidskompleksitet, betyder det, at vi ikke kan garantere konstante køretider i worstcase. Den faktiske tidskompleksitet afhænger bl.a. af hashtabellens opfyldningsgrad.

References

Et eksempel på anvendelse af Set
Slide Note Contents Index
References Speak
Vi ser nu på en konkret og realistisk anvendelse af Set interfacet.

Program: Et eksempel på en anvendelse af en Set klasse. Via argumentet til metoden main angiver vi en række tekststrenge, som indsættes i en mængde m. Hvis en allerede indsat streng indsættes igen registreres dette ved at add returnerer værdien false. Derved udskriver programmet en besked om, at der er opdaget en duplikat. Programmet afsluttes med at udskrive antallet for forskellige ord, samt selve mængden. Bemærk hvor hensigtsmæssigt det er, at Set klasser redefinerer metoden toString(). Dette program er taget direkte fra The Java Tutorial.
import java.util.*;

public class FindDups {
  public static void main(String args[]){
    Set s = new HashSet();
    for (int i=0; i<args.length; i++)
        if (!s.add(args[i]))
            System.out.println("Duplicate detected: " + 
                                args[i]);
    System.out.println(s.size() + 
                       " distinct words detected: " +
                       s);
  }
}

Reference

Interfacet List
Slide Note Contents Index
References Speak
Vi går nu over til at se på List interfacet

Interfacet List svarer til en ordnet samling af elementer

Undertiden omtales en ordnet samling som en sekvens

Det er uproblematisk at have 'duplikater' i listen

Interfacet List arver fra Collection

  • Tilføjelser til List interfacet i forhold til Collection:

    • Tilgang til elementer via indekser

      • add(int,Object), get(int), remove(int), set(int,Object), subList(int,int)

      • Kun effektiv i array-baserede implementationer

    • Mulighed for at søge efter elementer

      • indexOf(Object), lastIndexOf(Object)

    • Mulighed for gennemløb via udvidet Iterator: ListIterator

    • Mulighed for at udtrække en delliste af en liste

      • subList(int,int)

References

Interfacet List
Slide Note Contents Index
References Speak
Vi fortsætter diskussionen af List fra forrige side

  • Opstramninger af List interfacet i forhold til Collection:

    • Operationen add(Object) tilføjer et element til enden af listen

    • Operationen remove(Object) fjerner den første forekomst af objektet i listen

    • Operationen list1.equals(list2) virker som:

      • list1 og list2 har equals elementer i samme rækkefølge

    • Meget specifikke krav til operationen hashCode

List i forhold til klassen Vector
Slide Note Contents Index
References Speak
Vi har tidligere i en tidligere lektion set på Vector klassen. Vi vil her relatere denne klasse til interfacet List.

Der er store ligheder mellem grænsefladen af klassen Vector og interfacet List

Vector er fra version 1.0 Java - List er kommet til i version 1.2

Vector er i version 1.2. retrofitteret til at implementere List

  • Ændringer fra Vector til List-baserede klasser:

    • Kortere navne

      • f.eks. elementAt ift. get

    • Anderledes parameterrækkefølge:

      • f.eks. setElementAt(Object,int) ift. set(int,Object)

Nye Java programmer bør ikke benytte Vector, men i stedet ArrayList eller LinkedList

References

Klasserne ArrayList og LinkedList
Slide Note Contents Index
References Speak

Klasserne ArrayList og LinkedList implementer interfacet List

ArrayList er en array-baseret implementation med direkte tilgang til elementer via get og set operationerne.

LinkedList er en implementation basert på dobbeltkædede lister, og som sådan uden direkte og effektiv tilgang til elementerne

References

Et eksempel på anvendelse af List
Slide Note Contents Index
References Speak
Vi ser nu på en konkret og realistisk anvendelse af List interfacet.

Program: Et eksempel på en anvendelse af ArrayList. Eksemplet svare nøje til et eksempel vi tidligere har set under gennemgangen af klassen Vector i lektionen om arrays og lister.
import java.util.*;
import java.io.*;

class ListDemo {

 static List store = new ArrayList();
 
 /** Insert element in v, such that v remains sorted */
 static void insert(String element, List lst){
  int i = 0;
  while (i < lst.size() && 
         ((String)lst.get(i)).compareTo(element) < 0
        )
    i = i + 1;
 
  lst.add(i,element);
 }
 
 
 public static void main(String[] args) throws IOException {
   BufferedReader stdin = 
      new BufferedReader (new InputStreamReader (System.in));
   String str;
   do{
     System.out.println("Type a string to be inserted " +
                        "(empty string terminates): ");
     str = stdin.readLine();  
     if (str.length() > 0){
       insert(str,store);
       System.out.println(store);
      }
     } while (str.length() > 0);
 }
}


Reference

Interfacet Map
Slide Note Contents Index
References Speak

Et objekt, der implementerer Map, er et associativt array

Som sådan afbildes en mængde af nøgler ind i en mængde af værdier

Maps er ikke Collections

  • Operationelle karakteristika ved Map interfacet:

    • Operation som tilføjer og sletter bidrag til afbildningen

      • put(Object key, Object value), remove(Object key)

    • Operationer som udtrækker værdien givet en nøgle

      • get(Object key)

    • Operationer som udtrækker mængder og collections af nøgler, værdier og (nøgle,værdi) par

      • keySet(), values(), entrySet()

      • Benyttes til iteration over nøgler, værdier og par i en map

References

Klasserne HashMap og TreeMap
Slide Note Contents Index
References Speak

Klasserne HashMap og TreeMap implementer interfacet Map

HashMap er basert på en hashtabel

TreeMap er baseret på træer

  • Forskelle på HashMap og TreeMap

    • HashMap specificerer ingen ordning på (nøgle,værdi)-par i afbildningen

    • TreeMap garanterer at (nøgle,værdi)-par er ordnet naturligt i forhold til nøglernes ordning

References

Et eksempel på anvendelse af Map
Slide Note Contents Index
References Speak

Program: Et eksempel på anvendelse af Map. Via argument array'et til main metoden overfører vi en række tesktstrenge. Disse tekststrenge organiseres i en Map, som afbilder tekststrengen til det hidtil sete antal forekomster. Bemærk, at værdien i et (nøgle,værdi)-par skal være et objekt; vi kan altså ikke afbilde en streng til et heltal. Derfor wrappes heltal af typen int til typen Integer. Eksemplet er taget fra afsnittet 'The Map Interface' i Java Tutorial. Jeg har omskrevet det en smule, for at gøre det lidt mere klart, hvad der foregår.
import java.util.*;

public class Freq {
  private static final Integer ONE = new Integer(1);

  private static Integer incr(Integer i){
    return new Integer(i.intValue() + 1);
  }

  public static void main(String args[]) {
   Map m = new HashMap();
   // Initialize frequency table from command line
   for (int i=0; i<args.length; i++) {
       Integer freq = (Integer) m.get(args[i]);
       m.put(args[i], freq==null ? ONE : incr(freq));
     }
   System.out.println(m.size()+" distinct words detected:");
   System.out.println(m);
 }
}

Ved at udskifte "HashMap" med "TreeMap" vil der blive lavet en sorteret tabel

Iterators for collections
Slide Note Contents Index
References Speak
Ligesom Enumerations spiller en vigtig rolle som iterators for kædede lister mv. er iterators særdeles vigtige i forbindelse med Java collections. Vi ser her på iterator begrebet, som det er knyttet til collections. Som vi vil se, er begrebet udvidet lidt i forhold til enumeration.

Interfacet Iterator er i princippet en udvidelse af Enumeration med en remove operation

Reelt er Iterator et nyt interface med ændret navngivning i forhold til Enumeration

References

  • Betingelser for fjernelse af elementer under et gennemløb:

    • Operationen remove kan kaldes én gang pr. kald af next.

    • Den underliggende Collection må ikke ændres på anden vis ændres under et gennemløb

Syn på collections
Slide Note Contents Index
References Speak
I en del forskellige sammenhænge kan der laves syn (views) på Collection og Map objekter, som gør det muligt at manipulere underliggende collections gennem et collection objekt, der opfattes som et syn.

Et syn (view) på en datasamling S er et objekt, som repræsenterer udvalgte dele af s.

Hvis man ændrer synet ændres S

Hvad med søgning og sortering?
Slide Note Contents Index
References Speak

Det ville være naturligt at organisere søgnings- og sorterings-operationer som metoder i Collection interfaces, f.eks. i List

Hvorfor er det ikke gjort?

Vi stiller her et spørgsmål, som bliver besvaret på de følgende sider.

References

Samlinger af statiske metoder
Slide Note Contents Index
References Speak
Vi slutter denne afdeling med at se på to klasser, som udelukkende indeholder statiske metoder. Metoderne i Collections klassen arbejder på Collection objekter af forskellige typer. Metoderne i Arrays klassen arbejder på 'native' Java arrays. Bemærk flertals betegnelsen af disse klasser. Der er altså stor forskel på 'Collection' interfacet og Collections klassen.

Pakken java.util indeholder to klasser, Collections og Arrays, som udelukkende organiserer metoder på hhv. Collection objekter og arrays

  • Bemærkelsesværdige metoder i Collections:

    • Søge- og sorteringsoperationer (binarySearch, sort).

    • Reorganiseringsoperationer (reverse, shuffle)

    • Fabrikationsmetoder for 'wrapning af Collections' (unmodifiableCollection, synchronizedCollection ...)

  • Bemærkelsesværdige metoder i Arrays:

    • Søge- og sorteringsoperationer (binarySearch, sort)

    • Returnering af et List view på et array (asList)

    • Et stort antal overloadede fill og equal operationer

Det vil ikke give mening at instantiere klasserne Collections eller Arrays

References


Algoritmer tilknyttet Collections

Overblik over Collection algoritmer
Slide Note Contents Index
References Speak
Vi starter med at give et overblik over de algoritmer, som er knyttet til Collection klasserne

  • Algoritmer på samlinger af data:

    • Sortering af List objekter

      • Hurtig (garanteret O(n log(n))) og stabil variant af sortering ved fletning

    • Shuffling af List objekter

    • Binær søgning i List objekter

      • Bemærkelsesværdig returværdi af binarySearch

    • Minimum og maxium operationer på Collection objekter

Reference

Alle algoritmer er statiske metoder i klassen Collections

Et kald ser ud som algoritme(collection, ...) og ikke collection.algoritme(...)

Et rimeligt valg idet der næppe er behov for at redefinere og variere algoritmerne ned over et klassehierarki

Ordninger på Collections
Slide Note Contents Index
References Speak

Eksistensen af en ordning på elementerne i en samling er en forudsætning for at kunne sortere og foretage binær søgning

  • Ordninger i Java:

    • En såkaldt 'naturlig ordning'

      • Realiseres af klasser som implementerer interfacet Comparable med metoden compareTo

      • Mange eksisterende klasser implementerer Comparable

      • Vore egne klasser kan naturligvis også implementere Comparable

    • En eksplicit angivet ordning

      • Realiseres af et sammenligningsobjekt, som indkapsler en sammenligningsfunktion

      • Sammenligningsobjektet overføres som parameter til sorterings og søgeoperationerne

      • Sammenligningsobjektet implementerer interfacet Comparator med metoden compare

References

Detaljer om sammenligning af objekter
Slide Note Contents Index
References Speak

  • Metoderne compare(x,y) og x.compareTo(y) kan returnere tre mulige kategorier af resultater:

    • negativt tal for x mindre end y

    • nul for x lig med y

    • positivt tal for x større end y

  • Metoderne compare og compareTo er konsistente med equals metoden:

    • (x.compareTo(y)==0) == (x.equals(y))

    • (compare(x,y)==0) == (x.equals(y))

  • Metoderne kaster en exception ClassCastException hvis man forsøger at sammenligne objekter, der ikke betragtes som sammenlignelige

Program: Et eksempel på definition af en naturlig ordning i en klasse Name. Eksemplet er lånt stort set uændret fra The Java Tutorial.
import java.util.*;

public class Name implements Comparable {
    private String  firstName, lastName;

    public Name(String firstName, String lastName) {
        if (firstName==null || lastName==null)
            throw new NullPointerException();
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public int compareTo(Object o) {
        Name n = (Name)o;
        int lastCmp = lastName.compareTo(n.lastName);
        if (lastCmp == 0)
          return firstName.compareTo(n.firstName);
        else return lastCmp;
    }

    public String firstName()    {return firstName;}
    public String lastName()     {return lastName;}

    public boolean equals(Object o) {
        if (!(o instanceof Name))
            return false;
        Name n = (Name)o;
        return n.firstName.equals(firstName) &&
               n.lastName.equals(lastName);
    }

    public int hashCode() {
        return 31*firstName.hashCode() + lastName.hashCode();
    }

    public String toString() {return firstName + " " + lastName;}

}

Program: En anvendelse af klassen Name. Denne klasse er ligeledes lånt fra The Java Tutorial.
import java.util.*;

public class NameSort {
  public static void main(String args[]) {
    Name n[] = {
       new Name("John", "Lennon"),    new Name("Karl", "Marx"),
       new Name("Groucho", "Marx"),   new Name("Oscar", "Grouch")
    };
    List l = Arrays.asList(n);
    Collections.sort(l);
    System.out.println(l);
  }
}


Stream klassehierarkierne

Stream begrebet
Slide Note Contents Index
References Speak

The concept stream: En stream er en mængde af information, der bringes til eller fra et program, og som processeres sekventieltEn stream er en sekventielt ordnet mængde af information. Informationen skrives af et program til et 'bestemt sted'. Eller informationen læses af et program fra et 'bestemt sted'. Det omtalte sted er ofte en fil, men det kan også være andet, såsom en netværksforbindelse eller et andet program

  • Eksempler på streams og stream processering:

    • Læsning af en fil

    • Skrivning til en fil

    • Pipeline forbindelser mellem programmer

    • Netværksforbindelse over Internettet

Selv om udgangspunktet i Stream begrebet er sekventiel processering giver det ofte mening at definere streams som tilbyder 'random access' tilgang til data

Streams i Java
Slide Note Contents Index
References Speak

Java Core API understøtter et meget stort hierarki af Stream klasser

  • Den overordnede strukturering af Stream klasser i Java Core API:

    • Reader er roden i et hierarki af streams som formidler input af Unicode tegn

    • Writer er roden i et hierarki af streams som formidler output af Unicode tegn

    • Inputstream er roden i et hierarki af streams som formidler input af bytes (binære data)

    • Outputstream er roden i et hierarki af streams som formidler output af bytes (binære data)

    • Alle disse er gode eksempler på abstrakte klasser

References

Reader og Writer hierarkierne
Slide Note Contents Index
References Speak
Her viser vi hierarkierne af Reader og Writer klasserne, som alle arbejder på tegn

Figure. Reader og Writer hierarkierne. Kursiverede klassenavne repræsenterer abstrakte klasser

Kategorisering af tegn streams
Slide Note Contents Index
References Speak

For at forbedre overblikket kategoriserer vi her på tværs af input og output de tegn strømme, som læser fra eller skriver til bestemte endepunkter (sinks):

De strømme, som ikke læser eller skriver fra/til 'sinks' kaldes 'processing streams'; sådanne streams behandler data i forbifarten.

Tegn streams
Slide Note Contents Index
References Speak
Vi ser her nærmere på Reader og Writer, altså streams af tegn

Tekst filer med unicode tegn er repræsenteret som en strøm af bytes i en eller anden indkodning

  • InputStreamReader læser platformsafhængige tegn og afleverer Unicode tegn til Java programmet

  • OutputStreamWriter tager udgangspunkt i Unicode tegn og skriver platformsafhængige tegn

  • InputStreamReader og OutputStreamWriter er broer mellem tegn og byte streams

  • PrintWriter skriver de primitive datatyper i Java til en tekstfil

  • Der finder ikke en klasse i Java Core API der på tilsvarende måde kan indlæse primitive datatyper fra en tekstfil

Vi har ofte valgt at anvende en simpel klasse oopcourse.util.Console ,cs1.Keyboard eller SimpleInput til læsning af tegn og efterfølgende transformation til Java's primitive datatyper

Eksempel på anvendelse af klasserne FileReader og FileWriter
Slide Note Contents Index
References Speak
Vi ser her på et eksempel på anvendelser af klasserne FileReader og FileWriter. Eksemplet er tilpasset fra The Java Tutorial

Program: Et eksempel hvor tegnene fra én tekstfil kopieres over på en anden. Navnenen på filen tages fra parameteren til main (en array af String). Hvis man kører programmet med 'java copy xxx yyy' kopieres filen xxx til filen yyy.
import java.io.*;

public class Copy {
    public static void main(String[] args) throws IOException {

        FileReader in = new FileReader(new File(args[0]));
        FileWriter out = new FileWriter(new File(args[1]));
        int c;

        do{
          c = in.read();
          if(c != -1) out.write(c);
        } while (c != -1);  

        in.close();
        out.close();
    }
}

References

InputStream og OutputStream hierarkierne
Slide Note Contents Index
References Speak
Her viser vi hierarkierne af Inputstream og Outputstream klasserne, som arbejder på 'rå' bytes, altså binære filer

Figure. InputStream og OutputStream hierarkierne. Kursiverede klassenavne repræsenterer også her abstrakte klasser

Kategorisering af byte streams
Slide Note Contents Index
References Speak

For at forbedre overblikket kategoriserer vi på tværs af input og output de byte strømme, som læser fra eller skriver til bestemte endepunkter (sinks):

Reference

Byte streams
Slide Note Contents Index
References Speak
Vi ser her nærmere på InputStream og OutputStream, altså streams af bytes

  • Filter streams - FilterInputStream og FilterOutputStream - sætter streams i forlængelse af hinanden

    • Læse og skrive operationerne tager input fra og giver input til den 'indeholdte stream'

    • DataInputStream og DataOutputStream er eksempler på FilterStreams

    • Eksempel på anvendelse af filter streams på næste side

  • DataInputStream understøtter læsning af platformsuafhængige binære repræsentationer af de primitive datatyper i Java

  • DataOutputStream understøtter skrivning af primitive datatyper i Java til en platformsuafhængig binær repræsentation

Stream filtre
Slide Note Contents Index
References Speak
Det er muligt i Java at sammensætte filter streams på mangfoldige måder. Vi ser her på et par eksempler

Filter streams i Java kan kombineres til specialiserede former for streams

En binær fil hvorfra der læses primitive Java data gennem en buffer:

Program: Et program der viser hvordan streams kan kombineres. Variablen din refererer til en stream som er bygget fra filen 'number.dat'. På denne fil laves en FileInputStream, som kan læse binære data. På denne laves en BufferedInputStream, som læser disse data gennem en buffer. Endelig konstrueres en DataInputStream, som tillader os at læse de primitive Java data gennem bufferen
import java.io.*;

class StreamFilterExample{

 public static void main(String[] args) throws IOException {
  DataInputStream din = new DataInputStream(
                           new BufferedInputStream(
                             new FileInputStream(
                               new File("numbers.dat"))));

  int i;
  boolean b;
  
  i = din.readInt();
  b = din.readBoolean();

  System.out.println("i = " + i + ". b = " + b);

  din.close();
 }
}

Program: Et program som skriver et tal og en boolean på en binær fil.
import java.io.*;

class NumberProducer{

 public static void main(String[] args) throws IOException {
  DataOutputStream dout = new DataOutputStream(
                            new FileOutputStream
                             (new File("numbers.dat")));

  int i = 5;
  boolean b = false;

  dout.writeInt(i);
  dout.writeBoolean(b);

  dout.close();
 }
}

Reference


Collected references
Contents Index
Klassen Vector
The reference above goes to a lecture note pageThe reference above points to an earlier page in the lecture notes
Arrays i Java
The reference above goes to a lecture note pageThe reference above points to an earlier page in the lecture notes
Collections
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Interface begrebet
The reference above goes to a lecture note pageThe reference above points to an earlier page in the lecture notes
Collection Interfaces
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Interfacet Collection
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Interfacet Collection i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Interfacet Set
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Interfacet Set i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klasser som implementerer Collection
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Klassen TreeSet i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen HashSet i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Metoden add i Interfacet Set
The reference from above goes to Java API pageThe references above goes to material on the Internet
Interfacet List
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Interfacet List i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen Vector i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen LinkedList i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen ArrayList i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Eksempel på brug af klassen Vector
The reference above goes to a lecture note pageThe reference above points to an earlier page in the lecture notes
Interfacet Map
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Interfacet Map i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Associative arrays
The reference above goes to a lecture note pageThe reference above points to an earlier page in the lecture notes
Klassen TreeMap i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen HashMap i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen Enumeration i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Interfacet Iterator i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen Arrays i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen Collections i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Operationen binarySearch i klassen Collections
The reference from above goes to Java API pageThe references above goes to material on the Internet
Sorterings metode der benytter en Comparator
The reference from above goes to Java API pageThe references above goes to material on the Internet
Ordninger
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Interfacet Comparator i pakken java.util
The reference from above goes to Java API pageThe references above goes to material on the Internet
Interfacet Comparable i pakken java.lang
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen Writer i pakken java.io
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen Reader i pakken java.io
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen OutputStream i pakken java.io
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen InputStream i pakken java.io
The reference from above goes to Java API pageThe references above goes to material on the Internet
Streams i Java Tutorial
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Eksemplet i The Java Tutorial
The reference above goes to a Java Tutorial pageThe references above goes to material on the Internet
Klassen File i pakken java.io
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen FileWriter i pakken java.io
The reference from above goes to Java API pageThe references above goes to material on the Internet
Klassen FileReader i pakken java.io
The reference from above goes to Java API pageThe references above goes to material on the Internet
Object serialisering
The reference above goes to a lecture note pageThe reference above points to an earlier page in the lecture notes
Læsning og skrivning af objekt netværk
The reference above goes to a lecture note pageThe reference above points to an earlier page in the lecture notes

 

Chapter 11: Collections og streams
Course home     Author home     About producing this web     Previous lecture (top)     Next lecture (top)     Previous lecture (bund)     Next lecture (bund)     
Generated: March 31, 2008, 12:09:19