Techniki Zaawansowane
8 godz. 35 min · Java · Full-stack i Programowanie
Rafał SolarskiW poczatkowych lekcjach przyjrzymy sie pokladowi, na jakim bedziemy uruchamiali nasze programy. Wykorzystamy VisualVM do podgladania parametrów JVM. Zobaczymy równiez jakie zasoby sa tam dostepne oraz dowiesz sie jak monitorowac to, czy dobrze z nich korzystamy. Opowiemy Ci tez miedzy innymi o tym, jak zrobic heap i thread dump, oraz jak wlaczyc logi GC.
Kolejne lekcje kursu zostaly poswiecone wyrazeniom regularnym. Wyrazenia regularne mozemy wykorzystac nie tylko do walidacji danych wprowadzania przez uzytkownika, ale równiez do dzielenia tekstu oraz wyluskiwania wystapien wzorców w duzym tekscie. W tym rozdziale dowiemy sie miedzy innymi tego, jak mozemy wykorzystac ten potencjal z poziomu Javy.
Dzieki typom generycznym jestesmy w stanie osiagnac bezpieczenstwo typów w trakcie kompilacji przy zachowaniu elastycznosci pisanego kodu. W nastepnym rozdziale kursu przyjrzymy sie temu, jak mozemy je wykorzystac, oraz w jaki sposób czasami nalezy z tego bezpieczenstwa zrezygnowac.
Interfejsy funkcyjne to sposób na przeniesienie odrobiny swiata programowania funkcyjnego do Javy. Gdy polaczymy je z wyrazeniami lambda oraz API strumieni pozwola nam pisac te sama logike w duzo bardziej przejrzysty sposób.
Kolekcje, czyli listy, mapy, zbiory i kolejki to jedne z najczesciej wykorzystywanych klas w codziennej pracy. To jak dobrze poznamy ich mozliwosci ma ogromny wplyw na to, w jaki sposób bedziemy podchodzili do rozwiazywania wyzwan na naszej drodze.
System plików to zasób bez którego ciezko sobie poradzic. Pozwalaja nam na dostarczanie konfiguracji, danych wejsciowych i wyjsciowych, a przez to równiez integrowanie ze soba calych systemów.W tym rozdziale nauczymy sie korzystac z tych dobrodziejstw w bezpieczny sposób wykorzystujac m.in. IO Streams.
Trzymanie daty w String to niekoniecznie najwygodniejszy sposób. Juz od pewnego czasu Java dysponuje bardzo wygodnym Date&Time API - zobaczymy, co mozemy w nim znalezc.
Wielowatkowosc nie jest prosta... i dlugo tak jeszcze pozostanie. Nawet jesli korzystamy z frameworków, które próbuja ja przed nami ukryc, to ciagle musimy byc swiadomi problemów jakie sie z nia wiaza. W tym rozdziale poznamy glówne problemy na jakie mozna natrafic programujac wielowatkowo w Javie. Poznamy równiez klasy, które zdecydowanie pomoga nam zapanowac nad ta zlozonoscia.
JDBC to najbardziej podstawowy sposób laczenia sie z baza SQL z poziomu Javy. W wielu systemach/aplikacjach stosuje sie rozwiazania ORM takie jak JPA/Hibernate. Mimo wszystko warto wiedziec jak to pod spodem dziala oraz umiec poradzic sobie w aplikacjach, gdzie wybrano bardziej "lekkie" podejscie niz Hibernate.
Na koniec kursu wykorzystamy zdobyta wiedze, aby stworzyc prosta aplikacje pozwalajaca na przechowywanie danych o wydatkach. Po stworzeniu coreu aplikacji, mozesz spróbowac uzupelnic go za pomoca GUI.
Ten kurs stworzony zostal przede wszystkim z mysla o osobach, które juz poznaly podstawy jezyka, takie jak zmienne, mechanizmy kontroli wykonania, klasy, typy generyczne.Jezeli chcesz poczuc sie swobodnie nie tylko jesli chodzi o mechanizmy jezyka, ale równiez pod wzgledem znajomosci standardowej biblioteki Javy - to kurs w sam raz dla Ciebie. Materialy beda przydatne dla studentów, którzy znaja juz podstawowa skladnie Javy; programistów Javy chcacych poszerzyc lub uporzadkowac swoja wiedze; programistów innych jezyków, którzy chca poznac inny stack technologiczny.
Okej przejdźmy szybko do tego jak odczytać sobie jakiś
tekst czy bajty z jakiegoś pliku tutaj mamy plik lorem który
zawiera kilka zdań tak w linijkach no i odczytajmy sobie coś z tego pliku niech
to będą bajty więc wykorzystajmy obiekt z klasy file input stream
tworząc obiekt tej klasy podajemy jej w konstruktorze ścieżkę
do pliku razem z rozszerzeniem oczywiście i widzimy
że podczas wykonywania tego konstruktora może polecieć file not found exception
który nie dziedziczy po po runtime exception z tego względu jest to
checked exception czyli exception który musi zostać obsłużony tak
czyli możemy go albo pozwolić mu przefrunąć na zewnątrz i wtedy main po prostu
throw'uje albo musimy to tutaj złapać i tutaj jest
powiedzmy taka pułapka bo jeżeli spróbujemy sobie łapać
ten wyjątek to w ten sposób zaraz się trochę zapędzimy z tego względu że będzie
trzeba jeszcze zamknąć ten obiekt do tego celu jeżeli ten obiekt
jest autocloseable implementuje taki interfejs tu możemy sobie zobaczyć że
że go implementuje tak jest closeable a closeable dziedziczy
po autocloseable tak to wtedy możemy wykorzystać sobie składnię try with resources
która poza tym że wewnątrz niej możemy otworzyć jakiś obiekt tak
to jeszcze na koniec zostaje automatycznie wywołana po wyjściu z bloku
zostaje wywołana metoda close z tego obiektu niezależnie
od tego czy poleci jakiś extension wewnątrz powiedzmy tego bloku w momencie tworzenia
obiektu czy podczas zamykania tego obiektu ze względu na to że ten
close tutaj też może rzucić wyjątkiem tak więc od razu sobie wykorzystajmy taką
składnię okej poza tym że konstruktor rzuca file not found exception
to jeszcze kilka operacji które będziemy robili na tym strumieniu będzie
rzucało io exception oraz sam close rzuca io exception z tego względu możemy
wygeneralizować tego catch'a i po prostu łapać w nim io exeption wtedy wszystko
złapiemy okej i teraz tak tutaj po prostu deklarujemy powiedzmy zmienną
oraz tworzymy powiedzmy ją tak tutaj ważną
rzeczą jest to że strumień się otwiera w momencie wywołania konstruktora tak nie ma tam żadnej
metody już na tym obiekcie open i tak dalej i teraz to co nas interesuje w
na tym obiekcie jest metoda read ona czyta powiedzmy jeden bajt z tego
wyjściowego strumienia możemy go sobie wyświetlić teraz dostaliśmy 76
to jest wartość w tym momencie w unicode czyli utf8
tego pierwszego znaku l tak tu widzimy
ile to jest w hex tutaj jest tekst a tutaj jest w
postaci heksadecymalnej wyrażone poszczególne powiedzmy znaki stąd możemy też
ze względu na to że to jest strumień i powiedzmy raz przeczytany znak już powiedzmy
nie cofamy się w strumień tylko idziemy do przodu możemy sobie przeczytać kolejny
znak wywołując jeszcze raz tak okej dostaliśmy 111
i teraz jeżeli i powiedzmy chcemy już nie czytać bajtów
tylko chcemy czytać znaki to moglibyśmy tutaj sobie zrzutować na call ale to
nie byłoby do końca bezpieczne z tego względu że nie zostałoby uwzględniony teraz
kodowanie gdybyśmy mieli utf8 to oczywiście tutaj zadziała i mamy akurat utf8
ale żeby to było bezpieczne powinniśmy po prostu się przerzucić na hierarchię
strumieni odpowiedzialną za wczytanie znaków jeżeli czytamy
strumienie które są powiedzmy binarne to są to inputstream tak
file input stream to jest po prostu strumień binarny który czyta z pliku którego
źródłem jest plik jeżeli chodzi czytanie tekstowe tak no to mamy
wtedy reader'y i to by był po prostu file reader wtedy
wykorzystajmy sobie to teraz file reader okej i prawie
się nic nie zmieniło tak po prostu zmieniliśmy sobie tutaj tą klasę której obiekt
tworzymy zmieniliśmy sobie nazwę i teraz jeżeli to sobie odpalimy to metoda
dalej zwraca integera który w tym wypadku jest kodem utf8
tego znaku tak teraz to możemy sobie bezpiecznie rzutować
na karę na char na przykład tak jeden i drugi znak tutaj sobie wyprintujemy
mamy l i o odpowiednio i teraz spróbujmy sobie wyświetlić cały
plik w tym celu będziemy po prostu wywoływali read wewnątrz pętli i
teraz potrzebujemy warunku kiedy czytamy cały plik tak żeby zakończyć
powiedzmy tę pętlę w tym celu wykorzystamy tą właściwość że read
zwraca normalnie wartość w tym momencie character jeżeli to jest
reader albo zwraca minus 1 więc po prostu sobie zapamiętamy wartość zwracaną
tutaj utworzyliśmy sobie zmienną read tak w czasie przeszłym i
tutaj jest taki ciekawy wyrażenie tutaj jednocześnie sobie przypisujemy
wartość odczytanego znaku do zmiennej read jednocześnie
sprawdzamy czy nie zostało zwrócone minus 1 i to wszystko w jednej powiedzmy
w tym warunku no i tu jest taka właściwość że jeżeli sobie przypiszemy
wartość do zmiennej to wynikiem wartością takiego wyrażenia
jest wartość przypisana a więc możemy tutaj sobie sprawdzić czy to nie było minus
1 przypadkiem no i okej później dalej rzutujemy tego reada tak
i wyświetlamy sprawdźmy czy to działa przeczytaliśmy cały plik tylko nie zachowaliśmy
powiedzmy tutaj znaków i więc możemy sobie usunąć tego
ln stąd tak no okej tutaj mamy już teraz wszystko
wyprintowane tak to jeżeli chodzi o takie podstawowe czytanie niezależnie od
tego czy to jest tekstowe czy czy binarne czytanie to już mamy mniej
więcej opanowane przejdźmy dalej do kolejnej lekcji