PB162/Cvičení

Z FI WIKI
Přejít na: navigace, hledání

Poznámky ke cvičení z předmětu PB162 v semestru podzim 2008.

Administrativní otázky

Užívané technologie

  • Samozřejmě Java [1].
  • Jednoduché výukové IDE BlueJ [2].

Obojí je na FI nainstalováno jak ve windowsových tak v linuxových učebnách. Pokud budete používat vlastní notebook, budete si muset Javu i BlueJ stáhnout z výše uvedených odkazů a nainstalovat. Soubory pro počeštění prostředí BlueJ v případě zájmu naleznete zde. V prostředí unixových stanic se bluej spustí pomocí příkazů

module add bluej
bluej

Základní práce s BlueJ je popsaná ve slajdech, podrobněji třeba v českém tutoriálu či jiných dokumentech. Seznam článků o Javě na této wiki naleznete na stránce Java nebo v kategorii Java. Seznam odkazů na různé externí články, seriály, tutoriály, novinky o Javě apod. najdete na stránce Java-odkazy.

Cvičení 1

Cvičení 2

Cvičení 3

Cvičení 4

Cvičení 5

Pole

for each cyklus novinka v Java 5

int array1[] = new int[3];
array1[0] = 0;
array1[1] = 1;
array1[2] = 2;
    
for (int item : array1) { 
   System.out.println(item);
}

API

Cvičení 6

JUnit

Výčtový typ

Od verze javy 1.5. (popis [4]) (BlueJ klik pravým tlačítkem, jedna z možnosti výběru u new class):

 
public enum NazevVyctovehoTypu { HODNOTA1, HODNOTA2, HODNOTA3 }

Cvičení 7

Procvičuje implementaci rozhraní, práci s poli, foreach, volání metod.

Zadání: Vytvořte tři implementace rozhraní java.io.FileFilter, a to:

  • AllFilter akceptující všechny soubory
  • SuffixFilter akceptující soubory se jménem končícím určitou příponou
  • SizeFilter akceptující soubory větší než určitá velikost

Vytvořte metodu

 
/**
 * Vypis souboru v zadanem adresari podle zadaneho filtru.
 * @param dir adresar
 * @param filter vybirajici soubory
 */
public static void findFiles(File dir,FileFilter filter);

a zavolejte ji pro aktuální adresář postupně se všemi vytvořenými filtry. Rekurzivní řešení vypisující podadreáře je vítáno. Při řešení využijte metody:


Řešení:

 
package cz.muni.fi.pb162.findfiles;
 
import java.io.File;
import java.io.FileFilter;
 
 
/**
 * Vypis souboru podle zvolenych kriterii.
 *
 * @author Martin Kuba makub@ics.muni.cz
 */
public class FindFiles {
    /**
     * Akceptuje vsechny soubory bez rozdilu.
     */
    public static class AllFilter implements FileFilter {
        public boolean accept(File file) {
            return true;
        }
    }
 
    /**
     * Akceptuje vsechny soubory se zadanou koncovkou.
     */
    public static class SuffixFilter implements FileFilter {
        private String suffix;
 
        public SuffixFilter(String suffix) {
            this.suffix = suffix;
        }
 
        public boolean accept(File file) {
            return file.getName().endsWith(suffix);
        }
    }
 
    /**
     * Akceptuje vsechny soubory od zadane velikosti.
     */
    public static class SizeFilter implements FileFilter {
        private long minSize;
 
        public SizeFilter(long minSize) {
            this.minSize = minSize;
        }
 
        public boolean accept(File file) {
            return file.length() >= minSize;
        }
    }
 
    /**
     * Vypis souboru v zadanem adresari podle zadaneho filtru, bez rekurze.
     *
     * @param dir    adresar
     * @param filter vybirajici soubory
     */
    public static void findFiles1(File dir, FileFilter filter) {
        for (File f : dir.listFiles(filter)) {
            System.out.println(f.getName());
        }
    }
 
    /**
     * Vypis souboru v zadanem adresari podle zadaneho filtru, s podadresari.
     *
     * @param dir    adresar
     * @param filter vybirajici soubory
     */
    public static void findFiles(File dir, FileFilter filter) {
        for (File f : dir.listFiles()) {
            if (f.isDirectory()) {
                findFiles(f, filter);
            } else {
                if (filter.accept(f)) {
                    System.out.println(f.toString());
                }
            }
        }
    }
 
 
 
 
    public static void main(String[] args) {
        File pwd = new File(".");
        System.out.println("-----All files------");
        findFiles(pwd,new AllFilter());
        System.out.println("-----files *.java------");
        findFiles(pwd,new SuffixFilter(".java"));
        System.out.println("-----files >100B------");
        findFiles(pwd,new SizeFilter(100));
    }
}
 

Cvičení 8

Deklarace výjimky:

public class SomeException extends Exception {}

Vyvolání výjimky explicitně:

throw new SomeException();

Metoda, kde může dojít k výjimce, a já s ní nic dělat nebudu

public File getFile() throws IOException {}

Ošetření výjimečného stavu:

 
 try {
   //kod, ktery chceme hlidat
 } catch (SomeException ex) {
   //kod napravy, vypisu chyby apod, muze se retezit pro ruzne vyjimky 
   //- vyjimka se zachyti na prvnim odpovidajicim bloku.
 } finally {
   //kod s nejakym ukoncenim prace (uklid apod.)
 }

Cvičení 10

Kontejnery, uspořádaní

Generické typy

Cvičení 11

Zkopírujte si tuto třídu:

 
import java.util.Iterator;
import java.util.Random;
/**
 * Generates specified number of Strings with specified number of unique Strings.
 *
 * @author Martin Kuba makub@ics.muni.cz
 */
public class StringGenerator implements Iterable<String>,Iterator<String> {
 
    private int count;
    private int uniq;
    private Random rand;
    private long min;
 
    public StringGenerator(int count, int uniq) {
        this.count = count;
        this.uniq = uniq;
        this.rand = new Random(count+uniq);
        this.min = rand.nextInt(Integer.MAX_VALUE);
    }
 
    public Iterator<String> iterator() {
        return this;
    }
 
    public boolean hasNext() {
        return count>0;
    }
 
    public String next() {
        count--;
        return Long.toString((rand.nextInt(uniq)+1)*min,36);
    }
 
    public void remove() {
        throw  new UnsupportedOperationException();
    }
}

Vytvořte program, který použije tuto třídu k vygenerování řetězců tímto způsobem:

 
for(String s: new StringGenerator(100,20))

Vypište na standardní výstup:

  • kolikrát by který řetězec vygenerován
  • unikátní řetězce seřazené podle přirozeného pořadí tříd String
  • unikátní řetězce s počtem jejich opakování seřazené podle počtu opakování

Nápověda: využite třídy java.util.HashMap a její metody keySet() a entrySet(), a třídu java.util.ArrayList.

Cvičení 12

IO operace

Cvičení 12

Práce se soubory

 
 char[] c = new char[1024];
 while (true) {
  int charsRead = isr.read(c, 0, 1024);
  if (charsRead == -1) {
    break;
  }
  if (charsRead > 0) {
    osr.write(c, 0, charsRead);
  }
 }