Java 3

advertisement
JAVA – kontenery: interfejsy Collection i Map
import java.util.*;
public class Prog57 {
public static void main(String [] arg) {
Collection c = new ArrayList(); // ArrayList jest rodzaju List
c.add("one");
c.add(new Integer(3));
c.add("one");
System.out.println(c);
c2.add("one");
c2.add("two");
c2.add(new Integer(3));
c2.add("one");
System.out.println(c2);
// [one, 3, one]
Collections.fill((List)c,"one");
// działa tylko dla List i pokrewnych, zastępuje istniejące elem.
System.out.println(c);
// [one, one, one]
Collection c2 = new HashSet();
// HashSet jest rodzaju Set ,
będzie można dodawać tylko po jednym
// elemencie każdego rodzaju
JAVA 2 w praktyce
// [two, one, 3]
// odwzorowanie klucz--wartość
Map m = new HashMap();
m.put("one","1");
m.put("two","2");
m.put(new Double(3.12),"3.12");
System.out.println(m); // {two=2, one=1, 3.12=3.12 }
// klucz z lewej, wartość z prawej
}
} //Prog57
65
JAVA – kontenery a typy przechowywanych obiektów
import java.util.*;
class MyType {
float f = 3.3f; }
ArrayList można traktować jak tablicę o rozszerzalnej pojemności
public class Prog58 {
public static void main(String [] arg) {
ArrayList c = new ArrayList();
c.add("one"); c.add("two"); c.add(new Integer(3));
System.out.println(" rozmiar = " + c.size());
// 4
System.out.println(c);
// [one, two, 3 ]
String s = (String)c.get(1);
// wyjmowanie elementu o nr
System.out.println(s);
// two
// s = (String)c.get(2);
// wyjątek , niezgodne typy
c.add(new MyType());
// s = (String)c.get(4);
// wyjątek , niezgodne typy
}} //Prog58
JAVA 2 w praktyce
66
JAVA – inteligentny kontener dla klasy obiektów
import java.util.*;
public class Prog59 {
class MyType {
public static void main(String [] arg) {
float f = 3.3f;
MyType(float t) { f = t; }
MyTypeList m = new MyTypeList();
public float show(int nr) { return f; }
m.add(new MyType(2.1f));
}
m.add(new MyType(3.1f));
class MyTypeList {
System.out.println(" rozmiar = " + m.size()); // 2
private ArrayList a = new ArrayList();
System.out.println(m.show(0));
// 2.1
public void add(MyType t) { a.add(t); }
public MyType get(int nr) { return (MyType)a.get(nr); }
t = m.get(0);
public int size() { return a.size(); }
public float show(int nr) { return ((MyType)a.get(nr)).f; }
}
MyType t = new MyType(0.2f);
System.out.println(t.show(0));
// 2.1
}
} //Prog59
JAVA 2 w praktyce
67
JAVA –implementacja metod interfejsu Collection
System.out.println(a);
import java.util.*;
Object [] ob = l.toArray(); // zwraca Object [] z elem. kontenera
public class Prog60 {
System.out.println(ob.length);
public static void prt(Collection c) {
Iterator i = c.iterator();
// tak jak w l
//--> 5
String [] s = (String [])l.toArray(new String [1]); // zwrot tab []
// iterator
while(i.hasNext())
System.out.print(" - " + i.next());
System.ot.println();
}
a.clear();
// usuwa wszystko z a
System.out.println(a.isEmpty());
// czy jest pusta? true
l.remove("lin1");
// usuń argument "lin1"
System.out.println(l);
// [lin2, lin3, lin1, lin1]
a.add("lin1");
l.removeAll(a);
public static void main(String [] arg) {
// usuń wszystkie argumenty z l które są w a
a.add("lin3");
LinkedList l = new LinkedList();
l.retainAll(a);
ArrayList a = new ArrayList();
// część wspólna zbiorów pozostanie w l
System.out.println(l.size() + " " + l); // -> 1 [lin3]
l.add("lin1"); l.add("lin2"); l.add("lin3");
l.add("lin1"); l.add("lin1");
System.out.println(l.contains("lin3")); // czy zawiera element -> true
System.out.println(l.contains(a)); // czy zbiór a jest podzbiorem l? –
//-> false
a.addAll(l);
Prog60.prt(a);
// kopiuje z L - > a
// wypisuje z użyciem iteratora
} } //Prog60
JAVA 2 w praktyce
68
JAVA – List : LinkedList i ArrayList
Interfejs List – zachowuje kolejność elementów i dodaje nowe metody do interfejsu Collection, między innymi
ListIterator pozwalający na przeglądanie listy w obu kierunkach i wstawiania i wyjmowania ze środka listy (zalecane dla
LinkedList)
ArrayList – najlepsza (szybka) w przypadku dostępu swobodnego do elementów
LinkedList – szybkie wstawianie i usuwanie elementów,optymalny dostęp sekwencyjne do środka listy, posiada
dodatkowe metody addFirst(), addLast(), getFirst(), getLast(), removeFirst(), removeLast()
import java.util.*;
poz = a.lastIndexOf("lin1");
public class Prog61{
public static void main(String [] arg) {
l.remove(2);
//usuń element na pozycji 2
l.set(0,"mig");
// ustaw pozycje 0 na "mig"
if(it.hasNext()) {
LinkedList l = new LinkedList();
Object t = it.next(); poz = it.nextIndex(); }
ArrayList a = new ArrayList();
if(it.hasPrevious()) {
Object t = it.previous(); poz = it.previousIndex(); }
l.add("lin3"); l.add("lin1"); l.add("lin2"); a.addAll(l);
l.add(1,"lin1");
// na pozycję 1
int poz = l.indexOf("lin2");
// pozycja elementu
ListIterator it = a.listIterator(); // start od początku
it = a.listIterator(1);
// start od pozycji 1
it.add("su22");
it.set("tu154");
it.remove();
// usuń element
} } //Prog61
JAVA 2 w praktyce
69
JAVA – Set : HashSet i TreeSet
Interfejs Set – te same metody co interfejs Collection, ale różne zachowanie. Nie można przechowywać więcej niż
jednego egzemplarza wartości każdego z obiektów. Elementy umieszczone w Set muszą definiować metodę equals() w
celu możliwości ustalenia ich unikatowości. Set nie zapewnia utrzymywania obiektów w żadnym ustalonym porządku.
(*)HashSet – dla zbiorów wymagających szybkiej lokalizacji elementu.Elementy muszą definiować metodę hashCode().
TreeSet – zbiór uporządkowany typu SortedSet, posiada metody comparator(), first(), last(), subSet(), headSet(),
tailSet().
import java.util.*;
class MyType implements Comparable
{
float f;
String s;
MyType(float a, String s) { this.s = s; f=a;}
public boolean equals(Object o){
return (o instanceof MyType)
&& (f == ((MyType)o).f ) ; }
public int hashCode() {return (int)f; }
public int compareTo(Object o) {
float ff = ((MyType)o).f ;
return (ff > f? -1: (ff==f? 0:1) );}
}
equals - do ustalenia niepowtarzalności
compareTo - do sortowania (kolejność)
hashCode - dla tablic HashSet + equals
public class Prog62{
public static void main(String [] arg) {
Set a = new HashSet(); // Set a = new TreeSet();
a.add(new MyType(1.0f,"jeden"));
a.add(new MyType(2.0f,"dwa"));
a.add(new MyType(3.0f,"dwa")); // zgodnie z naszą
//compareTo nie są te same
a.add(new MyType(1.0f,"jeden")); // próba dodania tego
//samego..
System.out.println(a.size());
// --> 3
}
} //Prog62
JAVA 2 w praktyce
70
JAVA – TreeSet
System.out.println(a.size());
System.out.println(a);
import java.util.*;
class MyType implements Comparable
{
float f;
String s;
MyType(float a, String s) { this.s = s; f=a;}
public boolean equals(Object o){
return (o instanceof MyType)
&& (f == ((MyType)o).f ) ; }
public int hashCode() {return (int)f; }
public int compareTo(Object o) {
float ff = ((MyType)o).f ;
return (ff > f? -1: (ff==f? 0:1) ); }
public String toString(){
return s + f; }
}
public class Prog63{
Object o1 = a.first();
Object o2 = a.last();
public static void main(String [] arg) {
SortedSet a = new TreeSet();
a.add(new MyType(1.0f,"jeden"));
a.add(new MyType(2.0f,"dwa"));
a.add(new MyType(3.0f,"trzy"));
a.add(new MyType(4.0f,"cztery"));
a2 = a.tailSet(m3);
System.out.println(a2);
// --> 4
// [ jeden 1.0, dwa 2.0, trzy 3.0, cztery 4.0 ]
// zwraca najmniejszy element
// zwraca największy element
Iterator i = ((Collection)a).iterator();
Object m2 = i.next(); i.next();
Object m3 = i.next();
System.out.println(o1);
System.out.println(o2);
SortedSet a2 = a.subSet(m2,m3);
// podzbiór od elem. do elem. < m3
System.out.println(a2);
// [jeden 1.0, dwa 2.0 ]
a2 = a.headSet(m3);
System.out.println(a2);
// zwraca zbiór elementów < od podanego
// [jeden 1.0, dwa 2.0 ]
// zwraca zbiór elementów > bądź ==
// [trzy 3.0, cztery 4.0]
}
} //Prog63
JAVA 2 w praktyce
71
JAVA – Map: HashMap i TreeMap
Interfejs Map – przechowuje pary klucz-wartość, można więc odnaleźć wartość podając klucz
(*) HashMap – zalecana implementacja Map oparta na tablicy haszującej, wszystkie elementy muszą udostępniać metodę
hashCode()
TreeMap – zbiór typu SortedMap uporządkowany, posiada metody firstKey(), lastKey(), subMap(), headMap(),
tailMap()
import java.util.*;
class Licznik {
int i;
public String toString(){
return " "+ i; }
}
public class Prog64{
public static void main(String [] arg) {
HashMap ht = new HashMap();
for(int i = 0; i < 1000; i++)
{
// losowanie liczby z zakresu 0-10
Integer r = new Integer( Math.abs(ra.nextInt()%10) );
if ( ht.containsKey(r) )
// jeżeli jest klucz
((Licznik)ht.get(r)).i++;
// zwiększ wartość
else
ht.put(r, new Licznik()); // jak nie ma załóż nowy klucz
}
System.out.println(ht);
}
} //Prog64
Random ra = new Random();
JAVA 2 w praktyce
72
JAVA – implementacja Map dla kluczy własnych typów
import java.util.*;
class Subject implements Comparable {
String s;
float wsp;
static int i;
int nr ;
Subject(String s, float w) {this.s = s; wsp = w; nr = i++; }
public int hashCode() {
return (int)wsp + s.hashCode() ; }
public boolean equals(Object o) {
return ((o instanceof Subject)
&& (s == ((Subject)o).s)); }
public int compareTo(Object o) {
String ss =( ((Subject)o).s);
return( s.compareTo(ss)); }
public String toString() {
return " \n Subject["+ nr +"] " + s + "(" + wsp +")"; }
}
JAVA 2 w praktyce
class Teacher {
String s;
int i;
Teacher(String s, int i ) { this.s = s; this.i = i;}
public String toString() {
return s + " "+ i; }
public boolean equals(Object o) {
return ((o instanceof Teacher)
&& (s == ((Teacher)o).s)
&& (i == ((Teacher)o).i)); }
}
73
JAVA – implementacja Map dla kluczy własnych typów
public class Prog65{
public static void main(String [] arg) {
HashMap ht = new HashMap(); //TreeMap ht = new TreeMap();
ht.put(new Subject("C++ ",4.0f), new Teacher("assistant",1));
ht.put(new Subject("Java ",5.0f), new Teacher("assistant",1));
ht.put(new Subject("Pascal ",3.0f), new Teacher("lecturer ",3));
ht.put(new Subject("Fortran",2.0f), new Teacher("professor",4));
ht.put(new Subject("Pascal ",4.0f), new Teacher("lecturer ",2));
System.out.println("odwzorowanie klucz-wartosc ");
System.out.println(ht);
System.out.println("wartosci:\n ");
if (ht.containsValue(new Teacher("assistant",1)))
{
Collection value = ht.values();
System.out.println(value);
}
System.out.println("klucze:\n ");
if (ht.containsKey(new Subject("Fortran",2.0f)))
{
Set key = ht.keySet();
System.out.println(key);
key.removeAll(key);
System.out.println("odwzorowanie klucz-wartosc ");
System.out.println(ht);
}} } //Prog65
JAVA 2 w praktyce
// inny kod haszujący
// sprawdzenie czy zawiera wartość
// działa dzięki przesłonięciu equals()
//wartości mogą się powtarzać stąd Collection
// działa dzięki przesłonięciu equals()
// klucze są unikatowe zatem - Set
// zmiana kluczy zmienia odwzorowanie
// teraz puste
74
JAVA – implementacja Map dla kluczy własnych typów
Wersja Prog65 dla HashMap()
Wersja Prog65 dla TreeMap()
TreeMap() korzysta z compareTo(),
i porządkuje elementy według String
stąd Pascal 4.0 nie może być nowym
kluczem
JAVA 2 w praktyce
75
JAVA – implementacja Map dla kluczy własnych typów
System.out.println("odwzorowanie klucz-wartość ");
System.out.println(ht);
import java.util.*;
class Subject implements Comparable {
String s;
float wsp;
static int i;
int nr ;
Subject(String s, float w) {this.s = s; wsp = w; nr = i++; }
public int compareTo(Object o) {
String ss =( ((Subject)o).s);
return( s.compareTo(ss)); }
public String toString() {
return " \n Subject["+ nr +"] " + s + "(" + wsp +")"; }
}
public class Prog66{
public static void main(String [] arg) {
TreeMap ht = new TreeMap();
ht.put(new Subject("C++ ",4.0f),”1”);
ht.put(new Subject("Java ",5.0f), ”2”);
ht.put(new Subject("Pascal ",3.0f), ”3”);
ht.put(new Subject("Fortran",2.0f), ”4”);
ht.put(new Subject("Algol ",4.0f), ”5”);
Object small = ht.firstKey(); //pierwszy klucz
System.out.println(small);
Object high = ht.lastKey(); // ostatni klucz
System.out.println(high);
high = new Subject("Java ",5.0f);
small = new Subject("C++ ",4.0f);
System.out.println(small);
System.out.println(high);
SortedMap m1 = ht.subMap(small,high);
// odwzorowanie o podzbiorze kluczy
System.out.println(m1);
// odwzorowanie o kluczach < od podanego
m1 = ht.headMap(high);
System.out.println(m1);
// odwzorowanie o kluczach > = od podanego
m1 = ht.tailMap(small);
System.out.println(m1);
}} //Prog66
JAVA 2 w praktyce
76
JAVA – niemodyfikowalne kontenery Collections i Map
import java.util.*;
class Subject implements Comparable {
String s;
float wsp;
static int i;
int nr ;
Subject(String s, float w) {this.s = s; wsp = w; nr = i++; }
public int compareTo(Object o) {
String ss =( ((Subject)o).s);
return( s.compareTo(ss)); }
public String toString() {
return " \n Subject["+ nr +"] " + s + "(" + wsp +")"; }
}
public class Prog67{
Składnia dla Collection, Set i List:
Collections. unmodifiableCollection(Collection c)
Collections. unmodifiableList(List c)
Collections. unmodifiableSet(Set c)
public static void main(String [] arg) {
Map ht = new TreeMap();
ht.put(new Subject("C++ ",4.0f),"1");
ht = Collections.unmodifiableMap(ht);
// ht.put(new Subject("C ",1.0f),"6"); zabronione
}} //Prog67
JAVA 2 w praktyce
77
JAVA – obsługa błędów
import java.util.*;
// własna klasa wyjątku
class MyException extends Exception {
MyException() {}
MyException(String message) {
super(message);}
}
public class Prog68{
// definicja metody w której może wystąpić
public static void function (int i) throws MyException {
if (i == 1) throw new MyException(" jestem z f ");
}
public static void main(String [] arg) {
try {
Prog68.function(1);
try { // blok chroniony
...............(tu może powstać wyjątek)
} catch( Typwyjątku identyfikator) {
} catch ( Typwyjątku identyfikator) {
........
} finally { czynności wykonywane za każdym razem
}
!! catch wykonywane jest tylko dla pierwszego
pasującego
} catch (MyException e) {
System.out.println(" zlapalem swój"); // najpierw klasa pochodna
} catch (Exception e) {
System.out.println(" zlapalem ");
// bazowa nie może być wcześniej
} finally {
// bo kod dla błędu typu MyException nie
// byłby wykonywany
System.out.println(" zlapalem czy nie to koniec");
}
}
JAVA 2 w praktyce
} //Prog68
78
JAVA – klasa Exception
Exception dziedziczy z Throwable
import java.util.*;
zwracanie komunikatu:
public class Prog69{
public static void main(String [] arg) {
String getMessage()
String getLocalizedMessage()
opis Throwable łącznie dostępnymi szczegółami:
try {
throw new Exception ("jestem wyjątkiem ");
String toString()
ślad stosu wywołań:
} catch (Exception e) {
System.err.println(" getMessage = " +
e.getMessage()) ;
System.err.println(" getLMessage = " +
e.getLocalizedMessage());
System.err.println(" toString = " + e);
e.printStackTrace(System.err);
}
}
} //Prog69
void printStackTrace()
//std. wyjście
void printStackTrace(PrintStream) // na podany strumień
void printStackTrace(PrintWriter) // na podany strumień
zapis w obiekcie Throwable informacje o stanie stosu:
Throwable fillInStackTrace()
JAVA 2 w praktyce
79
JAVA –wyrzucenie wyjątku na inny poziom
import java.util.*;
A
public class Prog70{
public static void f() throws Exception{
throw new Exception(" wygenerowany w f ");
}
public void fowner() throws Throwable {
try{
f();
}catch (Exception e) {
System.err.println("wewnątrz fowner ");
e.printStackTrace(System.err);
B
// przekazanie na wyższy poziom lub nowy Throwable
A) throw e;
B) // throw e.fillInStackTrace(); //nowy
}}
public static void main(String [] arg) throws Throwable{
try {
Prog70 m = new Prog70();
m.fowner();
} catch (Exception e) {
System.err.println("mam wyjątek w main");
e.printStackTrace(System.err);
// ślad pamięta że e pochodzi z f()
} }} //Prog70
JAVA 2 w praktyce
80
JAVA – wyjątki a przeciążanie
W metodzie przeciążonej można zgłaszać jedynie
wyjątki z klasy podstawowej lub wyjątki które
dziedziczą po wyjątkach klasy bazowej
import java.util.*;
class AException extends Exception{}
class BException extends Exception{}
class CException extends Exception{}
public class Prog71{
class SException extends AException{}
public static void main(String [] arg) {
interface First {
void set() throws AException,BException;
//void move() throws AException,BException;
void open() throws AException;
}
class Second implements First {
public void set() {System.out.println("");}
//zgłaszać
// public void move() throws CException {}
//dodawać niedziedziczących wyjątków
public void open() throws SException {};
}
try {
Second f = new Second();
f.set();
// f.move();
f.open();
// ok nic nie trzeba
// nie można
// taki można
JAVA 2 w praktyce
} catch (Exception e) {
System.err.println("mam wyjatek ");
}
}
} //Prog71
81
JAVA – System wejścia - wyjścia : klasa File
import java.io.*;
import java.util.*;
class DirFilter implements FilenameFilter{
String s;
DirFilter(String s) { this.s = s;}
public boolean accept(File dir, String name) {
String f = new File(name).getName();
return f.indexOf(s) != -1; }
}
// to klasa reprezentująca filtr
// obcięcie informacji o ścieżce
// inaczej File x = new File(name); f = x.getName();
// jeżeli dany podciąg nie występuje indexOf zwraca -1
// zatem wynik false
public class Prog72{
public static void main(String [] arg) {
File path = new File(".");
String [] list;
if( arg.length == 0 )
list = path.list();
else
list = path.list(new DirFilter(arg[0]));
for(int i = 0; i < list.length; i++)
System.out.println(list[i]);
}} //Prog72
// ustawia na bieżący katalog
// wszystkie pliki i katalogi
// jeśli arg np "java” w list będą tylko
// katalogi i pliki z takim ciągiem znaków w nazwie
// list używa funkcji accept
JAVA 2 w praktyce
82
JAVA – System wejścia - wyjścia: klasa File
public class Prog73{
public static void fileHistory(String name) {
File f = new File(name);
System.out.println(
" \nFile location: " + f.getAbsolutePath() +
" \nRead ready ?: " + f.canRead() +
" \nReadOnly ? : " + !(f.canWrite()) +
" \nName
: " + f.getName() +
" \nParent ? : " + f.getParent() +
" \nLength ?
: " + f.length() +
" \nModified ? : " + f.lastModified());
}
public static void main(String [] arg) {
File path;
if (arg.length != 0) path = new File(arg[0]);
// pobranie ścieżki katalogu
else path = new File(".");
// domyślnie bieżący
String [] list;
File current;
list = path.list();
System.out.println(" Listing of " + path.getAbsolutePath());
for(int i = 0; i < list.length; i++){
current = new File(list[i]);
if (current.isDirectory()) System.out.println("directory "+ list[i]);
if (current.isFile()) Prog73.fileHistory(list[i]); }
}
JAVA 2 w praktyce
} //Prog73
83
JAVA – System wejścia - wyjścia: klasa File
if (arg.length == 3) {
dpath = new File(arg[0]);
f1path = new File(arg[0]+"\\"+arg[1]);
f2path = new File(arg[0]+"\\"+arg[2]);
import java.io.*;
import java.util.*;
class DirFilter implements FilenameFilter{
String s;
DirFilter(String s) { this.s = s;}
public boolean accept(File dir, String name) {
String f = new File(name).getName();
return f.indexOf(s) != -1; }
}
public class Prog74{
public static void main(String [] arg) {
File dpath, f1path, f2path;
String [] list;
try{
if (!dpath.exists()) dpath.mkdirs();
// tworzy katalog
f1path.createNewFile();
File f3path = new File(arg[0]+"nowy.dat");
f3path.createNewFile();
// nowy plik
f3path.renameTo(f2path);
// zmiana nazwy
} catch (IOException e ) {
// wymagana obsługa
System.err.println(" Error occur in block 1 " ); }
try{
System.out.println("listing:");
list = dpath.list();
for(int i =0; i< list.length;i++) System.out.println(list[i]);
f1path.delete();
System.out.println("usunięte");
list = dpath.list();
for(int i =0; i< list.length;i++) System.out.println(list[i]);
}catch (Exception e ) {
System.err.println(" Error occur in block 2 " ); }
}}} //Prog74
JAVA 2 w praktyce
84
JAVA – System wejścia - wyjścia: hierarchia klas dla
strumieni bajtowych
InputStream (abstrakcyjna)
OutputStream (abstrakcyjna)
ByteArrayInputStream (tablica jako źródło)
ByteArrayOutputStream(tworzy bufor w pamięci)
StringBufferInputStream (string jako źródło) Deprecated!!
FileInputStream (plik jako źródło)
FileOutputStream
PipedInputStream (potok w wielowątkowych)
PipedOutputStream (potok w wielowątkowych)
SequenceInputStream(konwersja dwóch strumieni w jeden)
klasy dekoratory (zapewniające użyteczny interfejs):
FilterInputStream (abstrakcyjna)
FilterOutputStream(abstrakcyjna)
DataInputStream (dla danych typu podstawowego)
DataOutputStream
BufferedInputStream (dla strumieni buforowanych)
BufferedOutputStream
PrintStream (formatuje dane wyjściowe)
LineNumberInputStream (śledzi numery wierszy)
PushbackInputStream (umożliwia cofanie do strumienia ostatniego znaku)
JAVA 2 w praktyce
System.out jest opakowany w
PrintStream !!!
85
JAVA – System wejścia - wyjścia: strumienie bajtowe
import java.io.*;
import java.util.*;
public class Prog75{
public static void main(String [] arg) {
boolean zapis = true;
Strumienie wyjścia powiązane z plikami nadpisują istniejące
pliki !!!!!
try {
FileOutputStream fileOut = new FileOutputStream("c:\\jdk\\moj.dat");
int [] dane = { 2, 45, 158 };
for(int i = 0; i<dane.length; i++) FileOut.write(dane[i]);
fileOut.close();
} catch (IOException e ) { zapis = false; System.err.println("błąd zapisu"); }
if(zapis) {
try {
FileInputStream fileInp = new FileInputStream("c:\\jdk\\moj.dat");
boolean eof = false;
while(!eof) {
int value = fileInp.read();
if (value != -1) System.out.println(" "+value);
else eof = true; }
fileInp.close();
} catch (IOException e ) { System.err.println("błąd odczytu"); } }
}
} //Prog75
JAVA 2 w praktyce
86
JAVA – System wejścia - wyjścia: strumienie bajtowe
import java.io.*; import java.util.*;
public class Prog76{
public static void main(String [] arg) {
boolean zapis = true; boolean eof = false; byte [] tablica = { 1,2,3,4,5,6,7,8,9,10 };
try {
ByteArrayInputStream inp = new ByteArrayInputStream(tablica);
FileOutputStream fileOut = new FileOutputStream("c:\\jdk\\moj.dat");
BufferedOutputStream bufOut = new BufferedOutputStream(fileOut);
// fileout będzie buforowany
bufOut.write(tablica[0]);
//-> 1
bufOut.write(tablica,1,2);
// z tablicy od elementu 1 zapisze 5 bajtów --> 2,3
eof = false; while(!eof) {byte value = (byte)inp.read();
// read zwraca w formacie int
if (value != -1) bufOut.write(value);
//-> 1,2,3,4,5,6,7,8,9,10
else eof = true; }
bufOut.close();
} catch (IOException e ) { zapis = false; System.err.println("blad zapisu"); }
if(zapis) { try {
ByteArrayOutputStream out = new ByteArrayOutputStream(30);
// tworzy 30 bajtowy bufor w pamięci
BufferedInputStream bufInp = new BufferedInputStream(new FileInputStream("c:\\jdk\\moj.dat"));
eof = false;
while(!eof) { int value = bufInp.read();
if (value != -1) out.write(value) ;
// zapis do bufora
else eof = true; }
bufInp.close();
byte [] tab = out.toByteArray();
// utworzenie tablicy o zawartości bufora
for(int i =0; i < tab.length; i++) System.out.println(tab[i]);
JAVA 2odczytu");
w praktyce
87
} catch (IOException e ) { System.err.println("błąd
}}
} } //Prog76
JAVA – System wejścia - wyjścia: strumienie bajtowe
import java.io.*; import java.util.*;
public class Prog77{
public static void main(String [] arg) {
readBoolean()
writeBoolean();
readByte()
writeByte()
readShort()
boolean zapis = true;
readInt()
try {
FileOutputStream fileOut = new FileOutputStream("c:\\jdk\\moj.dat"); readLong()
BufferedOutputStream bufOut = new BufferedOutputStream(fileOut);
readFloat()
DataOutputStream dataOut = new DataOutputStream(bufOut);
dataOut.writeInt(2);
readDouble()
dataOut.writeBoolean(zapis);
readUTF()
dataOut.writeUTF(" To koniec zawartości pliku");
dataOut.close();
} catch (IOException e ) { zapis = false; System.err.println("błąd zapisu"); }
writeShort()
writeInt()
writeLong()
writeFloat()
writeDouble()
writeUTF()
if(zapis) { try {
DataInputStream dataInp =
new DataInputStream(new BufferedInputStream(new FileInputStream("c:\\jdk\\moj.dat")));
if (dataInp.available() != 0){
// jeżeli plik zawiera jakieś bajty (nie jest pusty)
int x
= dataInp.readInt();
boolean b = dataInp.readBoolean();
String s = dataInp.readUTF();
System.out.println(" " + x + " " + b + " " + s); }
dataInp.close();
} catch (IOException e ) { System.err.println("błąd odczytu"); } }
}} //Prog77
JAVA 2 w praktyce
88
JAVA – System wejścia - wyjścia: strumienie bajtowe
import java.io.*; import java.util.*;
public class Prog78{
public static void main(String [] arg) {
boolean zapis = true; boolean eof = false;
Uwaga ta klasa ma znacznik Deprecated!!
try {
StringBufferInputStream st = new StringBufferInputStream("jestem strumieniem");
BufferedOutputStream bufOut = new BufferedOutputStream(new FileOutputStream("c:\\jdk\\moj.dat"));
eof = false;
while(!eof) { char znak = (char)st.read();
if (znak != (char)-1 ) bufOut.write((byte)znak);
else eof = true; }
bufOut.close();
} catch (IOException e ) { zapis = false; System.err.println("blad zapisu"); }
if(zapis) { try {
BufferedInputStream bufInp = new BufferedInputStream(new FileInputStream("c:\\jdk\\moj.dat"));
eof = false;
while(!eof) {
char znak = (char)((byte)bufInp.read());
if (znak != (char)-1) System.out.println(znak);
else eof = true; }
bufInp.close();
} catch (IOException e ) { System.err.println("blad odczytu"); } }
}
} //Prog78
JAVA 2 w praktyce
89
JAVA – System wejścia - wyjścia: strumienie bajtowe
import java.io.*;
Strumienie wyjścia powiązane z plikami nadpisują istniejące
import java.util.*;
pliki !!!!!
public class Prog79{
public static void main(String [] arg) {
boolean zapis = true;
try {
PrintStream pout = new PrintStream(new BufferedOutputStream(new FileOutputStream("c:\\jdk\\moj.dat")));
pout.println(2.0);
pout.println(3);
pout.println('z');
pout.print(" to jest dobre ");
pout.close();
} catch (IOException e ) { zapis = false; System.err.println("blad zapisu"); }
if(zapis) { try {
BufferedReader bufInp = new BufferedReader(new FileReader("c:\\jdk\\moj.dat"));
String a,b,c,d;
a = bufInp.readLine() ;
b = bufInp.readLine() ;
c = bufInp.readLine() ;
d = bufInp.readLine() ;
System.out.println(a + " " + b + " " + c + " " +d );
bufInp.close();
} catch (IOException e ) { System.err.println("blad odczytu"); } }
JAVA 2 w praktyce
}} //Prog79
// strumień znakowy !!!
// zgodny z UNICODE
90
JAVA – System wejścia - wyjścia: strumienie znakowe
InputStream (abstrakcyjna)
Reader (abstrakcyjna)
ByteArrayInputStream (tablica jako źródło)
CharArrayReader
StringBufferInputStream (string jako źródło) Deprecated!!
StringReader
FileInputStream (plik jako źródło)
FileReader
PipedInputStream (potok w wielowątkowych)
PipedReader
OutputStream (abstrakcyjna)
Writer (abstrakcyjna)
ByteArrayOutputStream(tworzy bufor w pamięci)
ByteArrayOutputStream(tworzy bufor w pamięci)
- brak -
StringWriter
FileOutputStream
FileWriter
PipedOutputStream (potok w wielowątkowych)
PipedWriter (potok w wielowątkowych)
Konwersja:
InputStream  (InputStreamReader  Reader
OutputStream  (OutputStreamWriter)  Writer
JAVA 2 w praktyce
91
JAVA – System wejścia - wyjścia: strumienie znakowe
klasy dekoratory (zapewniające użyteczny interfejs):
FilterInputStream (abstrakcyjna)
FilterReader
BufferedInputStream (dla strumieni buforowanych)
BufferedReader
LineNumberInputStream (śledzi numery wierszy)
LineNumberReader
PushbackInputStream (umożliwia cofanie ostatniego znaku)
PushbackInputReader
FilterOutputStream(abstrakcyjna)
FilterWriter(abstrakcyjna)
BufferedOutputStream (dla strumieni buforowanych)
BufferedWriter
PrintStream (formatuje dane wyjściowe)
PrintWriter
JAVA 2 w praktyce
92
JAVA – System wejścia - wyjścia: strumienie znakowe
import java.io.*; import java.util.*;
public class Prog80{
public static void main(String [] arg) {
Strumienie wyjścia powiązane z plikami nadpisują istniejące
pliki !!!!!
boolean zapis = true; try {
PrintWriter bufOut = new PrintWriter(new BufferedWriter(new FileWriter("c:\\jdk\\moj2.dat")));
for(int i = 0; i < 5; i++) bufOut.println("nr " + i);
bufOut.close();
} catch (IOException e ) { zapis = false; System.err.println("blad zapisu"); }
if(zapis) { try {
BufferedReader bufInp = new BufferedReader(new FileReader("c:\\jdk\\moj2.dat"));
String [] tab = new String[100]; int i = 0;
while((tab[i++] = bufInp.readLine()) != null);
// czytanie liniami
for(i = 0; tab[i]!=null ; i++)
System.out.println(tab[i] );
bufInp.close();
} catch (IOException e ) { System.err.println("blad odczytu"); } }
}
} //Prog80
JAVA 2 w praktyce
93
JAVA – System wejścia - wyjścia: strumienie znakowe
import java.io.*; import java.util.*;
public class Prog81{
public static void main(String [] arg) {
boolean zapis = true;
File fname = new File("c:\\jdk\\moj2.dat");
if (fname.exists() && fname.isFile()){
FileWriter(String, ovveride Yes = true, No = false)
FileWriter(”mój.dat”) - nadpisze plik
FileWriter(”mój.dat”,false) - nadpisze plik
FileWriter(”mój.dat”,true) - dopisze na koniec pliku
// sprawdzamy czy jest taki plik
try {
BufferedReader strInp = new BufferedReader(new StringReader(" jestem komunikatem "));
PrintWriter bufOut = new PrintWriter(new BufferedWriter(new FileWriter(fname)));
bufOut.println(strInp.readLine());
bufOut.close();
} catch (IOException e ) { zapis = false; System.err.println("blad zapisu"); }
if(zapis) { try {
BufferedReader bufInp = new BufferedReader(new FileReader("c:\\jdk\\moj2.dat"));
String [] tab = new String[100]; int i = 0;
while((tab[i++] = bufInp.readLine()) != null);
for(i = 0; tab[i]!=null ; i++) System.out.println(tab[i] );
bufInp.close();
} catch (IOException e ) { System.err.println("blad odczytu"); } }
JAVA 2 w praktyce
} //if
}} //Prog81
94
JAVA – System wejścia - wyjścia: System.in
import java.io.*; import java.util.*;
public class Prog83{
public static void main(String [] arg) {
try{
// system.in to obiekt InputStream
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); // konwertujemy na Reader
String s,s1=new String();
System.out.println(" pisz co chcesz, pusty wiersz przerywa wczytywanie " );
while((s = input.readLine()).length() != 0 ) s1+=s+" ";
System.out.println(s1);
// system.out jest już opakowany w PrintStream
System.out.print(" Podaj wiek : ");
s =input.readLine();
int w = Integer.parseInt(s);
System.out.print(" Podaj wzrost w metrach : ");
s =input.readLine();
double r = Double.parseDouble(s);
System.out.println(" Masz lat: " + w + " i wzrostu " + r + " metra ");
} catch (IOException e ) { System.err.println("czytaj polecenia !!");}
JAVA 2 w praktyce
}} //Prog83
95
JAVA – System wejścia - wyjścia: strumienie bajtowepliki o dostępie swobodnym
import java.io.*; import java.util.*;
public class Prog82{
public static void main(String [] arg) {
try {
RandomAccessFile file = new RandomAccessFile("test.dat","rw");
for(int i = 0; i < 5; i++) {
System.out.println(file.getFilePointer());
file.writeInt(i);}
file.close();
RandomAccessFile file2 = new RandomAccessFile("test.dat","rw");
System.out.println(file2.getFilePointer());
file2.seek(8);
int i = file2.readInt(); System.out.println(" odczytalem = " + i); // -> 2
file2.seek(20);
file2.writeUTF("text");
file2.seek(20);
String s = file2.readUTF(); System.out.println(" odczytalem = " + s);
file2.close();
RandomAccessFile file3 = new RandomAccessFile("test.dat","r");
file3.seek(12);
i = file3.readInt();
System.out.println(" odczytalem ponownie= " + i);
file3.close();
JAVA 2 w
}catch(IOException e ) { System.err.println("blad");
} praktyce
}} //Prog82
// rw read and write
// 0,4,8,12,16
// rw read and write
// -> 0 pokazuje pozycje
// -> ustaw od 8 bajtu
// -> text
// r - read only
// - > 3
96
JAVA – zmiana standardowych strumieni
(przekierowanie)
metody statyczne:
import java.io.*;
import java.util.*;
System.setIn(InputStream);
System.setOut(PrintStream);
System.setErr(PrintStream);
public class Prog84{
public static void main(String [] arg) throws IOException {
BufferedInputStream input = new BufferedInputStream(new FileInputStream("Prog84.java"));
PrintStream output = new PrintStream(new BufferedOutputStream(new FileOutputStream("wyniki.dat")));
System.setIn(input);
System.setOut(output);
System.setErr(output);
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s=read.readLine())!= null) System.out.println(s); // czytamy z wejściowego i zapisujemy do wyjściowego
output.close();
}
} //Prog84
JAVA 2 w praktyce
97
JAVA – kompresja GZIP
import java.io.*; import java.util.*;
import java.util.zip.*;
public class Prog85{
public static void main(String [] arg) throws IOException {
GZIPOutputStream(OutputStream)
GZIPInputStream(InputStream)
BufferedInputStream input = new BufferedInputStream(new FileInputStream("Prog85.java"));
BufferedOutputStream output = new BufferedOutputStream (
new GZIPOutputStream (
new FileOutputStream ("Prog85.gz")));
int bajt;
while ((bajt = input.read()) != -1 ) output.write(bajt);
input.close();
output.close();
BufferedReader input2 = new BufferedReader (
new InputStreamReader (
new GZIPInputStream (
new FileInputStream ("Prog85.gz"))));
String s;
while((s=input2.readLine())!= null) System.out.println(s);
input2.close();
JAVA 2 w praktyce
}} //Prog85
98
JAVA – kompresja Zip: dodawanie do archiwum
import java.io.*; import java.util.*; import java.util.zip.*;
public class Prog86{
public static void main(String [] arg) throws IOException {
FileOutputStream fileout = new FileOutputStream("testuj.zip");
CheckedOutputStream sumaout = new CheckedOutputStream(fileout, new Adler32());
// plik archiwum
// dla sumy kontrolnej
ZipOutputStream zipfileout = new ZipOutputStream( new BufferedOutputStream( sumaout));
String [] files = new String [] {new String("Prog85.java"), new String("Prog86.java") };
int bajt;
for(int i = 0; i < files.length; i++) {
BufferedInputStream inp = new BufferedInputStream( new FileInputStream(files[i]));
ZipEntry ze = new ZipEntry(files[i]);
zipfileout.putNextEntry(ze);
while ((bajt = inp.read())!= -1 ) zipfileout.write(bajt);
inp.close();
} // for
zipfileout.close();
System.out.println(" suma kontrolna = " + sumaout.getChecksum().getValue() );
JAVA 2 w praktyce
}} //Prog86
// dodawanie do archiwum
// suma kontrolna
99
JAVA – kompresja Zip: odczyt z archiwum
import java.io.*; import java.util.*; import java.util.zip.*;
public class Prog87{
public static void main(String [] arg) throws IOException {
FileInputStream fileinp = new FileInputStream("testuj.zip");
CheckedInputStream sumainp = new CheckedInputStream(fileinp, new Adler32());
ZipInputStream zipfileinp = new ZipInputStream(
new BufferedInputStream( sumainp));
int bajt;
ZipEntry ze;
while((ze = zipfileinp.getNextEntry())!=null) {
System.out.println(" Rozpakowuje plik o nazwie " + ze);
// odczyt składników (plików)
BufferedOutputStream out = new BufferedOutputStream (
new FileOutputStream(ze.getName()));
// nazwa składnika(pliku)
while((bajt = zipfileinp.read()) != -1) out.write(bajt);
out.close();
}
System.out.println(" suma kontrolna = " + sumainp.getChecksum().getValue() );
}
} //Prog87
JAVA 2 w praktyce
100
Download