Wstęp Java Zadanie Celem laboratorium jest zapoznanie się z podstawami platformy oraz języka Java. W ramach zadania należy przygotować aplikację zarządzania notatkami użytkownika obsługiwaną z konsoli. Aplikacja powinna pozwalać na przechowywanie notatek w pamięci komputera oraz zapis/odczyt do/z pliku tekstowego i binarnego a także do bazy danych. Realizacja Główna klasa programu Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu. public class App { public static void main(string[] args) { Klasa notatki Należy przygotować klasę pozwalającą na przechowywanie informacji o tytule, treści i dacie notatki. Klasa powinna zawierać prywatne pola typu String, String i Date dostępne poprzez publiczne metody get i set. public class Notatka { private String tytul; public String gettytul() { return tytul; public void settytul(string tytul) { this.tytul = tytul; Kontener z notatkami Należy przygotować klasę spełniającą rolę kontenera dla notatek. Klasa powinna zwierać kolekcję typu Map gdzie kluczami będą identyfikatory typu Integer a wartościami obiekty notatek. Pole kolekcji powinno być prywatne i udostępnione poprzez metody get i set. public class Notatnik { private Map<Integer, Notatka> notatki = new HashMap<>();
Wczytywanie notatek Wszystkie komendy od użytkownika powinny być pobierane ze standardowego wejście za pomocą bajtowego strumienia System.in. Aby wygodnie korzystać ze standardowego strumienia należy go udekorować strumieniem znakowym InputStreamReader. Aby móc wygodnie czytać liniami tekstu należy otrzymany strumień udekorować strumieniem BufferedReader. Od tego momentu można wejście użytkownika wczytywać poprzez metodę readline. InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String line = br.readline(); catch (IOException ex) { Przykładowe wejście programu może wyglądać następująco: add tytuł notatki treść notatki Wartość daty nie musi być wczytywana z wejścia ponieważ obiekt daty stworzony za pomocą konstruktora Date będzie zawierał datę wskazującą na moment stworzenia. Do zamiany obiektu typu String na Integer można skorzystać z metody statycznej Integer.parseInt. InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String line = br.readline(); catch (IOException ex) { String liczbatekstowo = "3"; int liczba = Integer.parseInt(liczbaTekstowo); Notatka notatka = new Notatka(); notatki.put(id, notatka); Wypisywanie notatek Do wypisywanie notatek należy skorzystać ze standardowego wyjścia dostępnego poprzez strumień System.out pozwalającego na wypisanie dowolnego obiektu. Przykładowo użytkownik podaje na wejściu programu: print Następnie na wyjściu otrzymuje: 204-04-06 2:00 tytuł notatki treść notatki Poprawne sformatowanie daty można uzyskać poprzez obiekt SimpleDateFormat. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Date teraz = new Date();
String sformatowanadata = dateformat.format(teraz); Aby wygodnie przejrzeć wszystkie notatki można skorzystać z pętli for each i przejrzeć wszystkie klucze i wartości zawarte w mapie. for (Integer klucz : notatki.keyset()) { Notatka wartosc = notatki.get(klucz); Nadpisywanie notatek Próba dodania notatki o identyfikatorze, który już istnieje powinno spowodować rzucenie wyjątku. Należy przygotować własną klasę wyjątku dziedziczącą po klasie Exception i następnie rzucić go w przypadku gdy dodawana notatka już istnieje. public class NotatkaJuzIstnieje extends Exception { if (notatki.contains(id)) { throw new NotatkaJuzIstnieje(); W celu nadpisania notatki użytkownik powinien wpisać polecenie update, a następnie takie same parametry jak w przypadku dodawania notatki. Próba aktualizacji nieistniejącej notatki również powinna skończyć się zgłoszeniem własnego wyjątku. Usuwanie notatek W celu usunięcia notatki użytkownik powinien wpisać polecenie remove a następnie podać jedynie identyfikator notatki do usunięcia. Próba usunięcia nieistniejącej notatki powinna skutkować rzuceniem odpowiedniego wyjątku. notatki.remove(id); Zapisywanie notatek do pliku W celu zapisania wszystkich notatek do pliku tekstowego użytkownik powinien wpisać polecenie save a następnie podać ścieżkę w jakiej notatki powinny być zapisanie. Zapisywanie do pliku można zrealizować poprzez strumień FileWriter, do którego podczas tworzenia można przekazać nazwę pliku. FileWriter fw = new FileWriter("plik"); fw.write("tekst"); fw.write("\n"); catch (IOException ex) { Plik wyjściowy może mieć następującą strukturę: 204-04-06 2:00 tytuł pierwszej notatki treść pierwszej notatki 2 204-04-06 2:02 tytuł drugiej notatki
treść drugiej notatki Odczytywanie notatek z pliku Aby wczytać notatki z pliku użytkownik powinien wpisać polecenie read a następnie ścieżkę do pliku zawierającego notatki. W celu odczytu z pliku można wykorzystać strumień FileReader który podobnie jak w przypadku System.in dla wygody należy udekorować odpowiednim strumieniem. FileReader fr = null; BufferedReader br = null; fr = new FileReader("plik"); br = new BufferedReader(fr); String line = br.readline(); catch (FileNotFoundException IOException ex) { Aby skonwertować tekst reprezentujący datę należy ponownie wykorzystać obiekt SimpleDateFormat. SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String sformatowanadata = "204-04-06 2:5"; Date data = dateformat.parse(sformatowanadata); Serializacja Aby zapisywać i odczytywać notatki w postaci binarnej należy wykorzystać mechanizm serializacji. Serializacja jest procesem przekształcania obiektów klas do strumienia bajtów. Taki strumień może zostać przykładowo zapisany do pliku lub wysłany przez sieć. Aby klasy mogły być poddane serializacji muszą implementować interfejs Serializable. Aby zapisać obiekt do pliku należy użyć strumienia bajtowego FileOutputStream. Sam strumień nie udostępnia metod zapisywania obiektów. Należy go udekorować strumieniem ObjectOutputStream. W przypadku odczytu z pliku należy analogicznie wykorzystać strumienie FileInputStream i ObjectInputStream. public class Notatnik implements Serializable { public class Notatka implements Serializable { FileOutputStream fos = null; ObjectOutputStream oos = null; fos = new FileOutputStream("plik"); oos = new ObjectOutputStream(fos); oos.writeobject(notatnik); catch (FileNotFoundException ex) { Połączenie z bazą danych W celu połączenia z bazą danych należy do projektu dodać bibliotekę z odpowiednim sterownikiem.
Dobór sterownika zależy od wykorzystanej bazy danych. Na laboratorium można skorzystać z bazy danych Derby, zainstalowanej razem z maszyną wirtualną Java i dostępną z poziomu NetBeans IDE. <dependency> <groupid>org.apache.derby</groupid> <artifactid>derbyclient</artifactid> <version>0.0..</version> </dependency> W celu nawiązania połączenia należy skorzystać z klasy DriverManager i metody getconnection, do której przekazuje się adres bazy danych (np.: jdbc:derby://localhost:527/notes), login oraz hasło użytkownika. Bazę danych można stworzyć w NetBeans IDE wybierając zakładkę Services, pozycję Databases i pod pozycję Java DB. Klikając prawym klawiszem myszy na Java DB pojawiają się opcje uruchomienia serwera oraz stworzenia nowej bazy danych. Przy tworzeniu bazy danych należy pamiętać aby zawsze podać jej nazwę oraz login i hasło użytkownika, który będzie mógł się z nią połączyć. Connection connection = null; connection = DriverManager.getConnection("adres", "login", "haslo"); catch (SQLException ex) { finally { if (connection!= null) { connection.close(); catch (SQLException ex) { Pobieranie elementów z bazy Aby pobrać elementy z bazy danych (wykonać zapytanie select) można skorzystać z obiektu Statment lub PreparedStatment (w przypadku gdy zapytanie ma mieć możliwość ustawiania parametrów). Wywołanie zapytania poprzez metodę executequery zwraca iterator ResultSet. Każdy z pozycji iteratora zawiera jeden wiersz z bazy danych, po których można się przesuwać za pomocą metody next. Pobranie wartości dla odpowiedniej kolumny realizuje się przez metody zwracające konkretne typy np.: getstring, getint, itd. Statement select = connection.createstatement(); ResultSet result = select.executequery("select * from notatki"); while (result.next()) { String tytul = result.getstring("tytul"); result.close(); statement.close(); Modyfikacja elementów w bazie Modyfikację elementów zazwyczaj realizuje się przez obiekt PreparedStatement oraz metodę executeupdate. PreparedStatement insert; insert = connection.preparestatement("insert into notatki (tytul) values (?)"); insert.setstring(, "Tytuł"); insert.executeupdate(); insert.close();