W skład platformy Java wchodzą dwa komponenty - maszyna wirtualna (interpreter bajtkodów) oraz biblioteka klas i interfejsów. W dzisiejszym przykładzie przeanalizujemy sposoby wykorzystania klas bibliotecznych wchodzących w skład każdej pełnej implementacji platformy Java. Dzisiejsze ćwiczenie będzie także związane z wyrobieniem niezbędnej wprawy w posługiwaniu się dokumentacją (Java Platform API Specification). Podobnie jak w pozostałych przykładach, jeżeli w ćwiczeniu wykorzystana została klasa biblioteczna, to jej pierwsze wystąpienie będzie jednocześnie linkiem do jej dokumentacji.
Poniżej znajdziesz kod źródłowy programu który tworzy obiekt reprezentujący prostokąt o zadanym wierzchołku, długości i wysokości i wykonuje na nim operację translacji o wektor (1,-1). Przeanalizuj przykład i porównaj użycie klasy bibliotecznej java.awt.Rectangle z użyciem Twojej własnej implementacji klasy Prostokat z poprzednich zajęć. Przypomnij sobie zagadnienia nazewnictwa klas oraz definiowania i importowania pakietów (wykład) i przeanalizuj je w kontekście wykorzystania klas Java Platform API.
import java.awt.Rectangle;
public class Program { public static void main(String[] args) { Rectangle obj=new Rectangle(0,0,4,3); obj.translate(1,-1); System.out.println(obj); } }
ćw. 3.1
Zapoznaj się z dokumentacją klasy bibliotecznej java.awt.Rectangle. W oparciu o informacje z poprzednich ćwiczeń zidentyfikuj pola, konstruktory i metody tej klasy i odpowiedz na pytanie jaka jest ich interpretacja i do czego służą.
ćw. 3.2
Utwórz obiekt obj1 reprezentujący prostokąt o wierzchołku w punkcie o współrzędnych (0,0), długości 4 i wysokości 3 oraz obiekt obj2 reprezentujący prostokąt o wierzchołku w punkcie (1,1), długości 4 i wysokości 3. Posługując się dokumentacją klasy java.awt.Rectangle znajdź odpowiednie metody i napisz program który utworzy obiekt reprezentujący prostokąt będący przecięciem (częścią wspólną) obj1 i obj2. Skompiluj i przetestuj przykład.
ćw. 3.3
Utwórz obiekt obj1 reprezentujący prostokąt o wierzchołku w punkcie o współrzędnych (1,1), długości 4 i wysokości 5 oraz obiekt obj2 reprezentujący prostokąt o wierzchołku w punkcie (2,0), długości 2 i wysokości 3. Posługując się dokumentacją klasy java.awt.Rectangle znajdź odpowiednie metody i napisz program który sprawdzi czy prostokąt obj1 zawiera się w prostokącie obj2. Skompiluj i przetestuj przykład.
ćw. 3.4
Utwórz obiekt obj reprezentujący prostokąt o wierzchołku w punkcie o współrzędnych (-3,0), długości 6 i wysokości 3. Posługując się dokumentacją klasy java.awt.Rectangle znajdź odpowiednie metody i napisz program który sprawdzi czy punkt o współrzędnych (2,-1) leży wewnątrz prostokąta obj. Skompiluj i przetestuj przykład.
ćw. 3.5
Utwórz obiekt obj1 reprezentujący prostokąt o wierzchołku w punkcie o współrzędnych (1,1), długości 4 i wysokości 5 oraz obiekt obj2 reprezentujący prostokąt o wierzchołku w punkcie (4,-3), długości 4 i wysokości 3. Posługując się dokumentacją klasy java.awt.Rectangle znajdź odpowiednie metody i napisz program który sprawdzi czy prostokąt obj1 przecina prostokąt obj2. Skompiluj i przetestuj przykład.
Poniżej znajdziesz przykład wykorzystania klas Java Platform API do wprowadzenia danych z klawiatury. Przykład ilustruje także koncepcję obsługi wyjątków i związaną z tym składnię.
import java.io.*;
public class A { static double KURS=3.8; public static void main(String[] args) { try { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("$: "); String str=br.readLine(); double x=Double.parseDouble(str); System.out.println("PLN: "+x*KURS); } catch(IOException e1) { System.out.println("wyjatek operacji wejscia/wyjscia"); } catch(NumberFormatException e2) { System.out.println("nieprawidlowy format liczby"); } } }
ćw. 3.6
Rozwiń przykład w ten sposób żeby umożliwić wybór pomiędzy kilkoma różnymi walutami i następnie przeliczenie ich po danym kursie.
Poniżej znajdziesz przykład wykorzystania klas Java Platform API do prostych operacji na plikach tekstowych. Przykład ilustruje także koncepcję obsługi wyjątków i związaną z tym składnię.
import java.io.*;
public class A { public static void main(String[] args) { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("imie: "); String imie=br.readLine(); System.out.print("nazwisko: "); String nazwisko=br.readLine(); PrintWriter plik1=new PrintWriter(new BufferedWriter(new FileWriter("plik.txt",true))); plik1.println(imie+" "+nazwisko); plik1.close(); } catch(Exception e){System.out.println(e);} System.out.println("\n-- z pliku --"); try { BufferedReader plik2=new BufferedReader(new FileReader("plik.txt")); String str; while(plik2.ready()) { str=plik2.readLine(); System.out.println(str); } plik2.close(); } catch(Exception e){System.out.println(e);} } }
ćw. 3.7
Napisz klasę Prostokat wyposażoną w metodę void save(String plik) zapisującą zawartość wszystkich pól tego prostokąta do pliku tekstowego o podanej nazwie.
ćw. 3.8
Napisz program demonstrujący użycie klas z dowolnej dostępnej ZEWNĘTRZNEJ biblioteki (zastosowania sieciowe, graficzne, matematyczne lub dowolne inne). Poniżej znajdziesz przykład wykorzystania zewnętrznej biblioteki open source zawierającej implementację szyfrowania asymetrycznym algorytmem RSA, którą można pobrać z www.bouncycastle.org. Możesz użyć tej biblioteki lub dowolnej innej według Twojego uznania.
import java.io.*; import java.security.*; import javax.crypto.*;
public class RSATest { public static void main(String args[]) throws Exception { System.out.println("zaczyna rejestrowac provider"); Provider prov = new org.bouncycastle.jce.provider.BouncyCastleProvider(); Security.addProvider(prov); System.out.println("zaczyna generowac generator pary kluczy"); KeyPairGenerator kpgen = KeyPairGenerator.getInstance("RSA","BC"); kpgen.initialize(1024, new java.security.SecureRandom()); System.out.println("zaczyna generowac pare kluczy"); KeyPair pair = kpgen.genKeyPair(); System.out.println("zaczyna generowac klucz prywatny"); PrivateKey priv = pair.getPrivate(); System.out.println("zaczyna generowac klucz publiczny"); PublicKey pub = pair.getPublic(); //-- CipherStream: szyfrowanie -- System.out.println("zaczyna generowac cipher"); javax.crypto.Cipher c1 = javax.crypto.Cipher.getInstance("RSA/ECB/PKCS1Padding","BC"); c1.init(Cipher.ENCRYPT_MODE,pub); System.out.println("zaczyna zestawiac strumien wyjsciowy"); ObjectOutputStream out=new ObjectOutputStream(new CipherOutputStream(new FileOutputStream("plik.txt"),c1)); System.out.println("zaczyna zapisywac obiekt do strumienia"); out.writeObject(new String("pozdrowienia od cioci")); out.flush(); out.close(); //-- CipherStream: deszyfrowanie -- System.out.println("zaczyna generowac cipher"); javax.crypto.Cipher c2 = javax.crypto.Cipher.getInstance("RSA/ECB/PKCS1Padding","BC"); c2.init(Cipher.DECRYPT_MODE,priv); System.out.println("zaczyna zestawiac strumien wejsciowy"); ObjectInputStream in=new ObjectInputStream(new CipherInputStream(new FileInputStream("plik.txt"),c2)); System.out.println("zaczyna czytac obiekt ze strumienia"); String str=(String)in.readObject(); System.out.println("\n-- "+str+" --\n"); in.close(); } }
Z. Dendzik, 2024