PB162/Cvičení: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
(Cvičení 7)
Řádka 71: Řádka 71:
  
 
== Cvičení 7 ==
 
== Cvičení 7 ==
 +
 +
Procvičuje implementaci rozhraní, práci s poli, foreach, volání metod.
 +
 +
'''Zadání:''' Vytvořte tři implementace rozhraní [http://java.sun.com/javase/6/docs/api/index.html?java/io/FileFilter.html java.io.FileFilter], a to:
 +
* '''AllFilter''' akceptující všechny soubory
 +
* '''SuffixFilter''' akceptující soubory končící určitou příponou
 +
* '''SizeFilter''' akceptující soubory větší než určitá velikost
 +
Vytvořte metodu
 +
<java>
 +
/**
 +
* Vypis souboru v zadanem adresari podle zadaneho filtru.
 +
* @param dir adresar
 +
* @param filter vybirajici soubory
 +
*/
 +
public static void findFiles(File dir,FileFilter filter);
 +
</java>
 +
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:
 +
*[http://java.sun.com/javase/6/docs/api/index.html?java/io/File.html java.io.File.isDirectory()]
 +
*[http://java.sun.com/javase/6/docs/api/index.html?java/io/File.html java.io.File.getName()]
 +
*[http://java.sun.com/javase/6/docs/api/index.html?java/io/File.html java.io.File.length()]
 +
*[http://java.sun.com/javase/6/docs/api/index.html?java/io/File.html java.io.File.listFiles()]
 +
*[http://java.sun.com/javase/6/docs/api/index.html?java/lang/String.html java.lang.String.endsWith()]
 +
 +
 +
'''Řešení:'''
 +
<java>
 +
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));
 +
    }
 +
}
 +
 +
</java>
 +
 
== Cvičení 8 ==
 
== Cvičení 8 ==
 
* http://www.artima.com/designtechniques/exceptions.html
 
* http://www.artima.com/designtechniques/exceptions.html

Verze z 6. 11. 2007, 09:23

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

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 končící 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

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);
  }
 }