V rámci java.time.format.DateTimeFormatter
je možné použít pro formátování roku malá y a velká Y. Špatně zvolené y může znamenat špatně dohledatelnou chybu. Malé y znamená year-of-era
, což vytvoří očekávaný výstup, kdy 31.12. bude vždy jako poslední den v daném roce. Velké Y znamená week-based-year
, což v případě týdnu, který spadá do více roků, vytvoří neočekávaný výstup. Pokud Silvestr (či pár předchozích dnů) připadnou do týdne, který nemá 31.12. v sobotu, budou dny poslední dny roku z přelomového týdne patřit do následujího roku. Příklad bude nejlepší. Takto to funguje na Linuxu, ale např. na Window byl výstup s velkým Y pro rok 2021 stejný jako pro malé y.
Java
Java 9 Flow.Subscriber and Flow.Publisher
Java 9 představila Flow API, které umožňuje reaktivní programování. V tomto příspěvku vytvořím aplikaci, která se bude skládat z jednoho publishera, který vytváří data a dvou subscriberů, kteří data zpracovávají. Jeden ze subscriberů je dostatečně rychlý a zvládá data zpracovávat rychleji, než je publisher produkuje, druhý subscriber je výrazně pomalejší.
Rozdíl mezi rozhraním a statickou třídou v Javě
Java 8 zavedla defaultní metody v rozhraní, čímž trochu smyla rozdíl mezi rozhraním a abstraktní třídou. V tomto příspěvku se tedy podíváme blíže na rozhraní, jejich defaultní metody, abstraktní třídy a rozdíly mezi rozhraními a abstraktními třídami. Defaultním metodám se věnoval i tento dřívější příspěvek.
Rozhraní:
Může obsahovat statické metody.
Může obsahovat metody, které jsou implementovány (mají tělo).
Pro implementaci rozhraní se používá klíčové slovo implements.
Rozhraní nemůže mít instanční proměnné.
Rozhraní může mít pouze proměnné typu public static final (konstanty).
Metody v rozhraní jsou defaultně public abstract.
Nedaří se nainstalovat default-jdk na Ubuntu
Řešil jsem problém, že na serveru je oracle Java 8 a po zadání apt-get install default-jdk se nic nestalo. Chtěl jsem nainstalovat open jdk 11. Řešením je přidat open jdk do PPA (Personal Package Archiver). Pro instalaci open jdk 11 můžete použít následující příkaz:
sudo add-apt-repository ppa:openjdk-r/ppa \ && sudo apt-get update -q \ && sudo apt install -y openjdk-11-jdk
Následně je možné použít příkazy update-java-alternatives --list
a update-alternatives --config java
pro nastavení výchozí Javy.
Zdroje:
Regulární výrazy v Javě
Pomocí regulárních výrazů definujeme vzory hledání pro řetězce. Vzor může být jediný znak, přesný řetězec, nebo složitý výraz obsahující speciální znaky.
Regulární výraz | Popis |
. | Jakýkoliv znak |
* | Výskyt 0 nebo vícekrát |
+ | Výskyt 1 nebo vícekrát |
? | Výskyt 0 nebo jedenkrát |
^ | Začátek řádky (^A – začátek řádku musí začínat na A) |
$ | Konec řádky (z$ – řádek musí končit na z) |
[] | Definice možných výskytů ([123] – obsahuje 1, 2 nebo 3) |
{} | Počet možných výskytů ({5,7} – vyskytuje se alespoň 5x a maximálně 7x) |
() | Seskupení výrazů |
| | Nebo (a|b – a nebo b) |
?! | Negace (a?!b – a pokud není následováno b) |
(?i) | Regulární výraz není citlivý na malá a velká písmena (pozor na písmena s diakritikou) |
\d | Jakékoliv číslo |
\D | Cokoliv kromě čísla |
\s | Jakýkoliv bílý znak |
\S | Cokoliv kromě bílých znaků |
\w | Písmeno, číslice nebo podtržítko |
\W | Cokoliv kromě písmena, číslice nebo podtržítka |
Java String má následující metody, které jako parametr mají regulární výraz:
string.matches("regex") string.split("regex") string.replaceFirst("regex", "replacement") string.replaceAll("regex", "replacement")
Pro pokročilejší práci s regulárními výrazy se používají třídy Pattern a Matcher.
final String text = "Nějaký text"; final String regex = "Regulární výraz"; final Pattern pattern = Pattern.compile(regex); final Matcher matcher = pattern.matcher(text); matcher.find()
Instalace Open JDK na Ubuntu
V tomto příspěvku se podíváme na to, jak instalovat Open JDK na Ubuntu. To, zda již nějakou verzi Javy máte nainstalovánu zjistíte příkazem java -version
.
java -version openjdk 11.0.2 2019-01-15 OpenJDK Runtime Environment (build 11.0.2+9-Ubuntu-3ubuntu118.04.3) OpenJDK 64-Bit Server VM (build 11.0.2+9-Ubuntu-3ubuntu118.04.3, mixed mode, sharing)
To, zda máte více verzí Javy zjistíte příkazem update-alternatives --config java
.
update-alternatives --config java There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java Nothing to configure.
Jak je vidět z výpisu mám pouze jednu verzi Javy. Defaultní JDK nainstaluje takto:
apt-get install default-jdk Reading package lists... Done Building dependency tree Reading state information... Done default-jdk is already the newest version (2:1.11-68ubuntu1~18.04.1).
V tomto případě není co instalovat.
Instalace Javy na Ubuntu
Nejdřív zjistíme, zda je Java již nainstalována či ne.
java -version Command 'java' not found, but can be installed with: apt install default-jre apt install openjdk-11-jre-headless apt install openjdk-8-jre-headless
Jak je z výpisu patrné, nainstalována není. Pokud potřebujete JDK, naistalujete jej pomocí:
apt install default-jdk
Když po instalaci zkontroluje verzi, objeví se vám podobný výpis.
java -version openjdk version "10.0.2" 2018-07-17 OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4) OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
Ubuntu, Nginx a Tomcat
Nginx je webobý server, který má mít oproti Apache lepší výkon. Tomcat je webový kontejner, ve kterém běží Java webové aplikace. Tomcat po spuštění poslouchá na portu 8080. Pokud nasadíte Java webovou aplikaci na Tomcatu, budete muset pro přístup k ní za url dodat port 8080, takže url by vypadala následovně: www.mojeaplikace.cz:8080. Uživatel, připojující se k takovéto aplikaci, si něco takového určitě pamatovat nebude. Řešením je nainstalovat webový server (Apache, Nginx, …) a přesměrovat provoz na Tomcat. V tomto příspěvku ukáži konfiguraci Nginx na Ubuntu, kdy Nginx bude směrovat provoz z portu 80 na port 8080. Aplikace tedy bude přístupná na očekávané url www.mojeaplikace.cz.
Instalace Nginx
apt-get install nginx
Konfigurační soubor pro Nginx je /etc/nginx/sites-available/default.
server { listen 80; server_name mojeaplikace.cz www.mojeaplikace.cz; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8080/; } }
Je dobré si ověřit, že jste v konfiguračním souboru nic nepokopali
nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Provedeme reload Nginx
systemctl reload nginx
Proudy v Java 8
Proudové (stream) zpracovávání je novinka Javy 8. Cílem je zjednodušit operace nad posloupnostmi prvků. Umožňují zřetězení operací. Operace se dělí do dvou hlavních skupin:
- terminální (terminal) – touto operací je proud uzavřen
- neterminální (intermediate) – vytváří nový proud
Jak je vidět z popisu, neterminální operace lze za sebou řetězit, dokud se nezavolá operace terminální.
Nejpoužívanější operace jsou
forEach | terminální | všechny prvky proudu postupně odešle konzumentovi |
findFirst | terminální | vrátí první prvek pokud existuje |
collect | terminální | sesbírá elementy a vytvoří z nich návratovou strukturu |
map | neterminální | převede prvky na jiné |
filter | neterminální | filtruje podle zadaného predikátu (podmínky) |
sorted | neterminální | seřadí prvky |
Příklady použití.
Testování private static final proměnné
Při testování se můžeme setkat s tím, že potřebujeme otestovat funkcionalitu, která není přes vystavené API přístupná. Jako příklad zde uvedu třídu Extractor. Jedná se o třídu, která čte soubor z přesně zadaného umístění. Z toho důvodu je soubor zadán jako private static final. Jak otestovat metodu getContent(), když nemáme přístup k souboru C:\input.txt (nemůžeme tento soubor modifikovat a dokonce tento soubor ani nemusí v době testů existovat)? Řešením je použít reflexi.
Extractor.java
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class Extractor { private static final File INPUT = new File("C:\\input.txt"); public Extractor() {} public String getContent() { String result = ""; try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(INPUT), "UTF-8"))) { String line; while ((line = br.readLine()) != null) { result = result + line; } } catch (IOException ioe) { ioe.printStackTrace(); } return result; } }
Testovací soubor testinput.txt umístěný v src/test/resources.