PB162/Cvičení
Poznámky ke cvičení z předmětu PB162 v semestru podzim 2008.
Obsah
Administrativní otázky
- Cvičení je povinné, dvouhodinové. Jsou tolerovány dvě neomluvené hodiny.
- Hlavní náplní je konzultovaná práce na bodovaných úlohách.
- Stránky předmětu
- v IS: https://is.muni.cz/auth/el/1433/podzim2008/PB162/
- na wiki: PB162
- Hodnocení, bodování úloh a termíny odevzdání viz PB162#Hodnocení
- Úlohy se odevzdávají do příslušné odevzdávárny ve formátu jar nebo zip.
- Sledujte Diskusní fórum k předmětu PB162, zde také řešte případné problémy s úlohami nebo čímkoliv jiným, co souvisí s Javou a tímto předmětem.
- PB162/Docházka do cvičení
Užívané technologie
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
- tutorial na Linuxsoft [3]
- JGlossary článek
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:
- java.io.File.isDirectory()
- java.io.File.getName()
- java.io.File.length()
- java.io.File.listFiles()
- java.lang.String.endsWith()
Ř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
- http://www.artima.com/designtechniques/exceptions.html
- Výjimky, nástroj pro řešení cizích (jejich vznik nemůžeme ovlivnit) chyb v Javovém programu - slídy zde, Tutoriál na SUNu
- logovani http://java.sun.com/j2se/1.5.0/docs/guide/logging/overview.html Java Logging
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í
- http://www.linuxsoft.cz/article.php?id_article=735 článek o Java kolekcích
- http://java.sun.com/docs/books/tutorial/collections/index.html Collections Tutorial
- http://java.sun.com/j2se/1.5.0/docs/guide/collections/index.html The Collections Framework
- http://java.sun.com/docs/books/tutorial/collections/interfaces/order.html CF Object Ordering
- http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html Comparable API
- http://www.onjava.com/pub/a/onjava/2003/03/12/java_comp.html?page=1 článek o porovnávání v kolekcích
- http://www.java2s.com/ExampleCode/Collections-Data-Structure/CompanyandEmployee.htm
- http://www.nextindex.net/java/collection/CollectionFramework.png Collection Schema
- http://msugai.fc2web.com/java/collection/collections.png Collection Schema
Generické typy
- http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf Generics in the Java Programming Language
- http://angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html hodně obsáhlé FAQ
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
- http://www.linuxsoft.cz/article.php?id_article=836 článek o IO
- http://java.sun.com/docs/books/tutorial/essential/io/ Java IO Tutorial
- http://jakarta.apache.org/commons/io/ Jakarta Commons IO
- http://java.sun.com/j2se/1.5.0/docs/guide/io/index.html IO
- http://java.sun.com/j2se/1.5.0/docs/guide/io/io.html základní členění streamu
- http://java.sun.com/j2se/1.5.0/docs/guide/nio/ NIO
- http://www.onjava.com/pub/a/onjava/2004/09/01/nio.html článek o NIO
- http://www.onjava.com/pub/a/onjava/2002/10/02/javanio.html článek o NIO
Cvičení 12
Práce se soubory
- http://www.linuxsoft.cz/article.php?id_article=866 článek o File
- http://java.sun.com/docs/books/tutorial/essential/io/file.html
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); } }