Basic Operators in Java

This article covers basic operators of Java syntax, and how they function. By thorough discussion and coding examples, you’ll be able to use basic operators in your programs like a pro.

What are basic operators?

Java provides different sets of operators to perform simple computations like addition/ subtraction and other advanced operators for decision making or individual bitwise calculations.

Here are some major categories of operators

  • Arithmetic Operators (+, -, *, /)
  • Relational Operators (==, !=)
  • Logical Operators (&&, ||)
  • Assignment Operators (=, +=, -=)
  • Unary Operators (pre/post-fix)
  • Shift Operators (>>, << )
  • Bitwise Operators (&, |, ^)
  • Ternary/Conditional Operator (?:)
  • Misc Operators

The scope of this article encompass arithmetic, relational and logical operators only.

Arithmetic Operators

You can use basic arithmetic operators to perform a mathematical calculation and impact the value of any variable. Let’s see how it works in Java.

package com.basicoperators.core;

public class ArithmeticOperators {
    public static void main(String[] args) {
        // Addition 
        int apples = 5;
        int oranges = 7;
        int totalFruits = apples + oranges;

        System.out.println("\n-------------Addition---------------- " );
        System.out.println("Apples: " + apples);
        System.out.println("Oranges: " + oranges);
        System.out.println("Total Fruits: " + totalFruits);

        // Subtraction      
        int totalBananas = 24;
        int bananasSold = 12;
        int bananasLeft = totalBananas - bananasSold;

        System.out.println("\n----------------Subtraction--------------- " );
        System.out.println("Total Bananas: " + totalBananas);
        System.out.println("Bananas Sold: " + bananasSold);
        System.out.println("Bananas Left: " + bananasLeft);

        // Multiplication   
        int weeks = 3;
        int daysInAWeek = 7;
        int totalNumberOfDays = weeks * daysInAWeek;

        System.out.println("\n--------------Multiplication-------------- " );
        System.out.println("Days In A Week: " + daysInAWeek);
        System.out.println("Days In A Week: " + daysInAWeek);
        System.out.println("Total Number Of Days: " + totalNumberOfDays);

        // Division
        int totalMinutesConsumed = 420;
        int minutesInOneHour = 60;
        int numOfHours = totalMinutesConsumed / minutesInOneHour;

        System.out.println("\n----------------Division---------------- " );

        System.out.println("Total Minutes: " + totalMinutesConsumed);
        System.out.println("Minutes In One Hour: " + minutesInOneHour);
        System.out.println("Num Of Hours: " + numOfHours);    


Apples: 5
Oranges: 7
Total Fruits: 12

Total Bananas: 24
Bananas Sold: 12
Bananas Left: 12

Days In A Week: 7
Days In A Week: 7
Total Number Of Days: 21

Total Minutes Consumed: 420
Minutes In One Hour: 60
Num Of Hours: 7

Relational Operators

As the name implies, relational operators define the relationship of one instance with another. This means you can compare two numbers and see what relationship do they share. If they are equal to each other, one is greater than or smaller than the other number. Like 2 is less than 3. According to Java syntax, both instances should be of the same data type. For example, you can not compare if an integer is less than a string. Here is a small snippet explaining how you can use basic relational operators in Java.

package com.basicoperators.core;

public class RelationalOperators {
    public static void main(String[] args) {
        int even = 2;
        int odd = 3;

        System.out.println("Even = " + even);
        System.out.println("Odd = " + odd);

        // prints if even is equal to odd
        boolean check = even == odd;
        System.out.println("Is Even equal to Odd? " + check);

        // prints if even is not equal to odd
        check = even != odd;
        System.out.println("Is Even not equal to Odd? " + check);

        // prints if even is greater than odd
        check = even > odd;
        System.out.println("Is Even greater than Odd? " + check);

        // prints if even is less than odd
        check = even < odd;
        System.out.println("Is Even less than Odd? " + check);

        // prints if even is greater than equal to odd
        check = even >= odd;
        System.out.println("Is Even greater than equal to Odd? " + check);

        // prints if even is less than equal to odd
        check = even <= odd;
        System.out.println("Is Even less than equal to Odd? " + check);


Even = 2
Odd = 3
Is Even equal to Odd? false
Is Even not equal to Odd? true
Is Even greater than Odd? false
Is Even less than Odd? true
Is Even greater than equal to Odd? false
Is Even less than equal to Odd? true

Logical Operators

Logical Operators in Java are used for decision making. They allow the programmer to test if the combination of given expressions are true or false. Based on the result of your expression, you can make a decision.

  • AND – returns “true” only if both expressions are true
  • OR – returns “true” if any of the given expressions is true
  • NOT – returns the “inverse” of any given boolean expression

For your better understanding, let’s look at the following snippet.

package com.basicoperators.core;

public class LogicalOperators {
    public static void main(String[] args) {
        String myPet1 = "doggo";
        String myPet2 = "kitty";

        System.out.println("Pet1: " + myPet1);
        System.out.println("Pet2: " + myPet2);

        // implements AND
        boolean check = myPet1.equals("doggo") && myPet2.equals("kitty");
        // returns true only when both conditions are true
        System.out.println("Does my first pet name \"doggo\", and second one \"kitty\"? " + check);

        check = myPet1.equals("dog") && myPet2.equals("kitty");
        // returns "false" even if single condition is false 
        // remember these conditions are case sensitive
        System.out.println("Does my first pet name \"dog\", and second one \"kitty\"? " + check);

        // implements OR
        check = myPet1.equals("doggo") || myPet2.equals("lion");
        // returns "true" even when single condition is true
        System.out.println("Does any of my pet name \"doggo\"? " + check);

        check = myPet1.equals("cat") || myPet2.equals("tiger");
        // returns "false" because both conditions are false
        System.out.println("Does any of my pet name \"tiger\"? " + check);

        // implements NOT
        check = !(myPet1.equals("bingo") && myPet2.equals("kate"));
        // returns "true" when both conditions are true (inverse of statement)
        System.out.println("Does my first pet name \"bingo\", and second one \"kate\"? " + check);

        check = !(myPet1.equals("doggo") && myPet2.equals("kitty"));
        // returns "false" because both conditions are true
        System.out.println("Does my first pet name \"doggo\", and second one \"kitty\"? " + check);


Pet1: doggo
Pet2: kitty
Does my first pet name "doggo", and second one "kitty"? true
Does my first pet name "dog", and second one "kitty"? false
Does any of my pet name "doggo"? true
Does any of my pet name "tiger"? false
Does my first pet name "bingo", and second one "kate"? true
Does my first pet name "doggo", and second one "kitty"? false


The basic operators in Java are pretty simple to learn and easy to use. You might get overwhelmed by studying the different operators all at once. However, we recommend you practicing one set at a time. This way, you’ll master all of them soon. As always, you’re welcome to plug-in in case of any confusion. Happy learning!

How do I install Calibri font in Ubuntu?

I need to create a Microsoft Word Mail Merge document in my Java Spring MVC application. But running it in Ubuntu server resulting in a document that missing the default font use in the document, which is the Calibri font. So I need to install the font in Ubuntu to make the document looks as expected.

Here what I need to do to install the font in my Ubuntu box. Starts by updating the repository package list to get latest packages information for upgrades or new package installation.

sudo apt-get update

Then install FontForge in our system. FontForge is a free and open source font editor, but in this case it will help doing the font conversion in the installation script on the upcoming step.

sudo apt-get install fontforge

Install the Microsoft Cabinet file unpacker. This is required for the next script to successfully install the fonts.

sudo apt-get install cabextract

The following script will install Microsoft Vista TrueType Fonts (TTF) in Ubuntu. It includes the following fonts, Calibri, Cambria, Candara, Consolas, Constantia, and Corbel.

wget -q -O - | sudo bash

Run the next command to see if the font successfully installed. You will see the Calibri fonts in the result if the fonts successfully installed.

fc-list | grep Calibri

Here are the list of installed Calibri fonts.

/usr/share/fonts/truetype/vista/calibriz.ttf: Calibri:style=Bold Italic
/usr/share/fonts/truetype/vista/calibrii.ttf: Calibri:style=Italic
/usr/share/fonts/truetype/vista/calibrib.ttf: Calibri:style=Bold
/usr/share/fonts/truetype/vista/calibri.ttf: Calibri:style=Regular

How do I create a generic class in Java?

In this example you will learn how to create a generic class in Java. In some of the previous post in this blog you might have read how to use generic for working with Java collection API such as List, Set and Map. Now it is time to learn to create a simple generic class.

As an example in this post will create a class called GenericMachine and we can plug different type of engine into this machine that will be use by the machine to operate. For this demo we will create two engine type, a DieselEngine and a JetEngine. So let’s see how the classes are implemented in generic.

package org.kodejava.examples.generic;

public class GenericMachine<T> {
    private T engine;

    public GenericMachine(T engine) {
        this.engine = engine;

    private void start() {
        System.out.println("This machine running on: " + engine);

    public static void main(String[] args) {
        // Creates a generic machine with diesel engine.
        GenericMachine<DieselEngine> machine = new GenericMachine<>(new DieselEngine());

        // Creates another generic machine with jet engine.
        GenericMachine<JetEngine> anotherMachine = new GenericMachine<>(new JetEngine());

Now, for the two engine class we will only create an empty class so that the GenericMachine class can be compile successfully. And here are the engine classes:

package org.kodejava.examples.generic;

public class DieselEngine {
package org.kodejava.examples.generic;

public class JetEngine {

The <T> in the class declaration tell that we want the GenericMachine class to have type parameter. We also use the T type parameter at the class constructor to pass the engine.

7 Of The Best Java Podcasts Today

Java has already taken the coding world by storm with its promises to create better technologies for the future. Though, if you’re looking to learn about the Java programming language from a podcast, it can be hard to find a sufficient developer (or in this case, Java) podcast to learn from, with literally hundreds of podcasts to listen to these days.

So, where should you start? Don’t panic! We’re here to help!

We’ve taken the liberty of searching for the best Java podcasts for you, despite the hundreds of great ones that are out there. Plus, we want to show you the most up-to-date podcasts that you can learn the coding language from.

So, without further ado, here are 7 of the best Java podcasts that you should definitely take a listen to today!

1. Simple Programmer Podcast

Okay, so this one’s not exclusively a Java podcast. However, there’s no denying that the Simple Programmer Podcast has got lots of great Java-exclusive episodes featuring many brilliant tips, especially for beginners. The Simple Programmer Podcast even helps to direct you towards all sorts of other equally useful Java resources, like books and courses.

2. Coders Campus

Want to learn how to program using the Java programming language? Then this podcast is for you!

Coders Campus will teach you step-by-step lessons on how to use Java to create your own web applications or mobile apps. “From clear tutorials to in-depth explanations of the Java programming language, all ideas and lessons are presented in plain English for better understanding. And, all important concepts are addressed, so that listeners can excel in the field of software,” says Tyler Gregory, a Java expert at UKWritings and Boomessays.

3. Inside Java

Inside Java has anything and everything Java, since it’s brought to you directly from the people that make Java at Oracle. As these people discuss the coding language, they’ll also cover the JVM, OpenJDK, platform security, innovation projects (i.e. Loom and Panama), and other exciting developments and stories about Java.

4. Java Pub House

Want to learn how to program in Java? Then tune in to Java Pub House, where they talk about the odds and ends of Java, like “Hello world,” O/R setups, threading, learning how to troubleshoot coding issues, etc. Once you subscribe to the podcast, you’ll have access to all episodes of the podcast, whether you’re at home or on the go. And whether you’re a novice to Java, or an expert developer looking to brush up on your skills, this is the podcast for you!

5. Coding 101

A Catholic priest talking coding? No kidding!

Father Robert Ballecer joins Lou Maresca on an amazing podcast called Coding 101. In this weekly instructional, project-oriented programming show, Fr. Ballecer and Maresca teaches Java to beginners and intermediate programmers within several interchangeable modules. With a wide range of topics to talk about – special interests, “applied” programming tips and tricks, other Java programs (i.e. C++, Visual Basic, PHP, Perl, etc.), etc., Coding 101 has stood the test of time, despite no longer being in production. You can catch all the episodes, along with guest programmer interviews on their website in the TWiT Archives.

6. Bus318 – Business Programming In Java

Leaning more towards expert Java developers, Bus318 acts as a hardcore Java education, with prerequisites in Computer Science 221 with a (C) or better, at least concurrent enrollment in Business 314. From advanced topics in object-oriented data modeling, to graphical user interfaces, to text and binary I/O, to calling on integration with relational and object-oriented databases, this podcast is your go-to learning spot for Java!

7. Java Off-Heap

“The Java Off-Heap Podcast is sure to bring listeners the latest tech news when it comes to Java,” says Spencer Talbot, a tech writer at Custom Writing and Reviewal. “From Java professionals from Chicago, to going over the latest news and issues, this podcast will go in depth on all the topics, bringing in the most useful knowledge that all Java developer novices and experts can take into consideration.”


So, are you ready to learn Java? Then check out these 7 select podcasts that will give you great insight on coding, and mastering Java!

Happy listening, and happy coding!

What Makes Java 14 Special?

Java 14 has finally been released in March 2020 and brings a whole host of new features that will help ease coding frustrations.

In this article, we will break down the top 6 features that make Java 14 an outstanding update compared to the previous versions. Here we go:

1. Switch Expressions

Although Switch Expressions was just a preview feature over the previous two versions, it has now been given permanent status in version 14.

The lambda syntax was introduced for switch expressions in Java 12 and this means that multiple case labels for pattern matching could be produced. This also stopped any fall-through that led to verbose code and enforced exhaustive cases that would issue a compilation error if all input cases weren’t entered.

In the previous versions yield statements were introduced to replace a break for returning values from an expression. Within Java 14, all these features are included as standard now. We should also point out that yield is not a new keyword for Java and is just used within switch expressions.

2. Previewing Text Blocks

Another former preview item, Text Blocks were first added into Java 13 with the intention to make multiline string literals much easier to create. In particular, HTML, JSON and SWL query strings became much easier as a result.

“Text blocks do remain a preview within Java 14, but they have some interesting new additions,” says Robert Class, a journalist at NextCoursework and Australia2Write. “In particular, you can now use a backslash to display smart multiline string blocks.”

The code \s can build trailing spaces that are ignored by the compiler as a default. This then preserves all of the spaces that are included before it.

3. Pattern Matching for instanceof

Most codebase creations by Java developers will include a strong use of instanceof conditions filtered in throughout the code. Generally speaking, the instanceof conditional check normally comes before an explicit typecast.

Within the Java 14, developers will be happy to know that this has been removed to make conditional extraction a lot clearer. The scope of this variable is currently limited to just the conditional block.

4. Useful NullPointerExceptions

Most developers will tell you that the null pointer exceptions have been a complete nightmare in previous versions of Java. The infamous NPEs can be exceedingly difficult to debug.

This invariably led to developers falling back on other debugging tools or trying to manually figure the variable/method that was null because the stack trace shows only the line number.

“In Java 14, we also see the introduction of a brand new JVM feature, which has enhanced insights with a descriptive stack,” suggests Anita Lockfield, a tech writer at Britstudent and Write My X. “This is not a language feature, but a development of the runtime environment.”

5. Previewing Records

Within Java, you can build classes to hold data and utilize encapsulation to control the way that the data is accessed and modified. It is an object-oriented language.

Because it uses objects, this makes manipulating complicated data types easy and straightforward. This is one of the things that makes Java popular as a platform. The problem has been that the creation of data types has been verbose in old versions and it needs a lot of code for even the simplest case.

Within Java 14, they have introduced records as a brand-new preview feature. This new concept helps developers to include a new language feature without having to make it part of the Java standard. This means that developers can test features and provide feedback that leads to changes before those features become standard.

If you want to use the preview feature, you need to specify the command line flag, --enable-preview for the compilation and runtime. For compilation, you must also specify the sourceflag. The record becomes a much simpler way of showing a data class.

6. New APIs

There are three new APIs within Java 14 that we love. The first is which contains a new annotation type called Serial. This was designed to be used with compiler checks on Serializations. This means that annotations of this type can be applied to serialization related methods and with the fields in any classes declared to be Serializable.

The second API that we enjoyed is java.lang. This class has two distinct methods for the new Record feature, including isRecord() and getRecordComponents(). These have a range of RecordComponent objects and gives up to eleven ways to retrieve things, like the details of annotations and the generic type.

Finally, the new java.util.concurrent.locks API has one new method called setCurrentBlocker. This provides an ability to unpark and park a thread. This helps avoid the same problems that previous versions have had with the Thread.suspend and Thread.resume methods. You can also set the Object that will be returned by getBlocker with this new API, which can help when recalling the no-argument park method from a non-public object.

Top 10 Best Apps for Programmers 2020

When it comes to using programming languages, coders can make an easy choice. Python is the fastest growing language, but JavaScript is still the most popular one. A great programmer knows what language to focus on, depending on the projects they develop.

But what about other programming tools?

The language is not the only thing that you need to choose. There are too many software developing tools, so you might get confused comparing all their features. First and foremost, you need a code editor. But you also need apps that help you focus and fight procrastination. Let’s not forget collaboration in real time, which is an essential need of modern programming teams.

We have a list for you. It combines various tools that cover different aspects of a programmer’s work. We’ll list the best apps for developers at the moment.

Top 10 Apps for Developers

1. CodeRunner

A successful programming process starts with the choice of an editor. It has to be fast, and it should support multiple languages.

CodeRunner meets those standards. It’s a lightweight Mac app that supports 25+ languages, and lets you do your work in the fastest way possible. Its bracket management, auto-indenting, and code completion features are outstanding.

2. Todo.txt

Your list of programming tools needs an app that lets you plan tasks and update them as you go through the daily schedule.

Todo.txt is a simplistic app, without too many options, reminders, drop-downs, and additional features that aren’t necessary when you want to create a straightforward list of tasks. You’ll interact with it right from the command line. This may not be what a usual to-do app user would like, but it’s definitely something a programmer appreciates.

3. Marked

If you use Markdown for easy formatting, you need apps for programmers that let you see the styled version before its publication. Marked gives you that option.

In addition to the preview feature, it also gives you tools for simplifying your style, checking the grammar and spelling, lightening the word count, and achieving an optimal reading time for the visitor.

4. Appian

This list of apps for developers wouldn’t be complete without Appian – a tool that lets you develop perfect mobile apps. It makes app development as easy as it gets. According to the provider’s estimations it takes eight weeks from the idea development to the app’s completion with the use of this low-code tool.

Appian lets you achieve greater speed by automating processes and combining data from multiple sources.

5. Unity

This is one of the best 3D software developing tools on the market. It’s perfect for creating games, architecture and engineering projects, automotive models, and more.

Unity offers a great user manual, which the most popular apps for programmers often skip. With these complete lessons, you’ll easily learn how to use the tool to its full potential.

6. MusicForProgramming

A music platform is not the first idea that comes to mind when you search for the best apps for developers. However, MusicForProgramming is one of those essential tools that help you work in a focused environment.

Currently there are 59 playlists that are specifically designed as the perfect background to a coder’s working process.

It’s much better than creating your own playlists on YouTube. Let’s be honest: it would take a lot of time for you to create 59 different playlists. Plus, when you choose your own music, you’re too attached to some pieces, which can make you distracted.

7. RescueTime

Is there a programmer who has never burned out? It’s a common situation, which leads to procrastination, dissatisfaction, and more procrastination. RescueTime can prevent the delays that you make when you feel unmotivated to work. It records how much time you spend on different apps and sites.

The reality hit will be enough for you to get back to work… seriously.

8. iTerm2

Your Mac’s Terminal is one of the essential programming tools that you use. But do you feel like it’s stuck back in time? iTerm2 is a similar, but more advanced tool.

It lets you split a tab into multiple panes, so you’ll navigate through different sessions. It also has a convenient search feature, which will find parts of your code that you need to work on. It has an autocomplete function, mouseless copy feature, easily accessible paste history, and more.

9. Unicode Table

This is an outstanding searchable database for all the Unicode characters that you plan to use. It includes alphabets, math symbols, fancy letters, flowers, stars, emoji, hearts, and much more.

You will get Unicode, CSS, and HTML codes for each character that you plan to use.

10. Codeanywhere

Gone are the days when programming was considered to be solitary work. Nowadays, we all use collaborative apps for developers, which allow us to join forces and work on different parts of the code at the same time.

This is a simple code editor, which lets you work remotely from any location. You will connect with your team, and you’ll all make changes in the code in real time. The app manages to make that process NOT messy, since it easily lets you switch between versions and check out each change that was made.

Only Use the Apps That You Need

Since the choice of tools for programmers is so great, it’s easy to start using more apps than you need to.

You need only a few software developing tools and accompanying software to support your work. Anything beyond the essentials may clog up your work environment.

That’s why we listed tools in different categories. Even if you use all of them, they won’t collide with one another. Check them out, and use the ones that can help you enhance your workflow.

How do I convert java.util.TimeZone to java.time.ZoneId?

The following code snippet will show you how to convert the old java.util.TimeZone to java.time.ZoneId introduced in Java 8. In the first line of our main() method we get the default timezone using the TimeZone.getDefault() and convert it to ZoneId by calling the toZoneId() method. In the second example we create the TimeZone object by calling the getTimeZone() and pass the string of timezone id. To convert it to ZoneId we call the toZoneId() method.

package org.kodejava.example.datetime;

import java.time.ZoneId;
import java.util.TimeZone;

public class TimeZoneToZoneId {
    public static void main(String[] args) {
        ZoneId zoneId = TimeZone.getDefault().toZoneId();
        System.out.println("zoneId = " + zoneId);

        TimeZone timeZoneUsPacific = TimeZone.getTimeZone("US/Pacific");
        ZoneId zoneIdUsPacific = timeZoneUsPacific.toZoneId();
        System.out.println("zoneIdUsPacific = " + zoneIdUsPacific);

This snippet prints the following output:

zoneId = Asia/Shanghai
zoneIdUsPacific = US/Pacific

To convert the other way around you can do it like the following code snippet. Below we convert the ZoneId to TimeZone by using the TimeZone.getTimeZone() method and pass the ZoneId.systemDefault() which return the system default timezone. Or we can create ZoneId using the ZoneId.of() method and specify the timezone id and then pass it to the getTimeZone() method of the TimeZone class.

package org.kodejava.example.datetime;

import java.time.ZoneId;
import java.util.TimeZone;

public class ZoneIdToTimeZone {
    public static void main(String[] args) {
        TimeZone timeZone = TimeZone.getTimeZone(ZoneId.systemDefault());
        System.out.println("timeZone = " + timeZone.getDisplayName());

        TimeZone timeZoneUsPacific = TimeZone.getTimeZone(ZoneId.of("US/Pacific"));
        System.out.println("timeZoneUsPacific = " + timeZoneUsPacific.getDisplayName());

And here are the output of the code snippet above:

timeZone = China Standard Time
timeZoneUsPacific = Pacific Standard Time

How do I get a list of all TimeZones Ids using Java 8?

To retrieve a list of all available time zones ids we can call the java.time.ZoneId static method getAvailableZoneIds(). This method return a Set of string of all zone ids. The format of the zone id are “{area}/{city}”. You can use this ids of string to create the ZoneId object using the ZoneId.of() static method.

package org.kodejava.example.datetime;

import java.time.ZoneId;
import java.time.format.TextStyle;
import java.util.Locale;
import java.util.Set;

public class GetAllTimeZoneIds {
    public static void main(String[] args) {
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();
        for (String id : zoneIds) {
            ZoneId zoneId = ZoneId.of(id);
            System.out.println("id          = " + id);
            System.out.println("displayName = " + 
                zoneId.getDisplayName(TextStyle.FULL, Locale.US));

Here are some of zone IDs printed out to the console:

id          = Asia/Aden
displayName = Arabian Time
id          = America/Cuiaba
displayName = Amazon Time
id          = Etc/GMT+9
displayName = GMT-9:00
id          = Etc/GMT+8
displayName = GMT-8:00
id          = Africa/Nairobi
displayName = Eastern Africa Time
id          = Europe/Nicosia
displayName = Eastern European Time
id          = Pacific/Guadalcanal
displayName = Solomon Is. Time
id          = Europe/Athens
displayName = Eastern European Time
id          = US/Pacific
displayName = Pacific Time
id          = Europe/Monaco
displayName = Central European Time

How do I get HTTP headers using HttpClient HEAD request?

The HTTP HEAD method is used for reading the headers information of a resource returned when accessing it using the HTTP GET method. Such request can be done before deciding to download a large resource to save bandwidth. The response to a HEAD method should not have a body, in the code below we use the HttpResponse.BodyHandlers.discarding(), which is a response body handler that discards the the response body.

In the code snippet below we start by creating an instance of HttpClient, in this example we use the HttpClient.newBuilder().build() method. After creating the HttpClient we create the HttpRequest object. We set the HTTP method to HEAD by calling the method method() and pass a string “HEAD” as the method name and HttpRequest.BodyPublishers.noBody() a request body publisher which sends no request body.

The next step in the code below is to send the request and get the response headers from the HttpResponse object using the headers() method. The map() method of the HttpHeaders object give us a key-values of the headers returned by the server.

package org.kodejava.example.httpclient;


public class HeadRequestExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newBuilder().build();

        HttpRequest request = HttpRequest.newBuilder()
            .method("HEAD", HttpRequest.BodyPublishers.noBody())

        HttpResponse<Void> response = client.send(request,

        // Returns an unmodifiable multi map view of this HttpHeaders.
        // The map contains key of string, with list of strings as
        // its value.
        HttpHeaders headers = response.headers();, values) ->
            System.out.printf("%s = %s%n", key, values));

Here are the HTTP headers we got and printed out to the console screen:

:status = [301]
alt-svc = [quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000]
cache-control = [public, max-age=2592000]
content-length = [220]
content-type = [text/html; charset=UTF-8]
date = [Wed, 22 Apr 2020 14:41:49 GMT]
expires = [Fri, 22 May 2020 14:41:49 GMT]
location = []
server = [gws]
x-frame-options = [SAMEORIGIN]
x-xss-protection = [0]

How do I read website content using HttpClient?

The HTTP Client API can be used to request HTTP resources over the network. This new API was introduced as a new API in Java 11. It supports HTTP/1.1 and HTTP/2 and also support both synchronous and asynchronous programming models. The code snippet below show you how to use the new API to read the content of a website page.

In the code below we start by creating a new instance of HttpClient using the newHttpClient() static method. This is equivalent to calling newBuilder().build(). This give us an instance of HttpClient with default settings like using the “GET” request method the as the default. Then we create an HttpRequest object using the newBuilder() method, set the request URI and call the build() method to build the HttpRequest object.

Next we send the request by calling the send() method of the HttpClient object. This will sends the given request, blocking if necessary to get the response. The returned HttpResponse object contains the response status, headers, and body as handled by given response body handler.

package org.kodejava.example.httpclient;

import java.nio.charset.StandardCharsets;

public class ReadWebsiteContent {
    public static void main(String[] args) throws Exception {
        // Creates HttpClient object with default configuration.
        HttpClient httpClient = HttpClient.newHttpClient();

        // Creates HttpRequest object and set the URI to be requested, 
        // when not defined the default request method is the GET request.
        HttpRequest request = HttpRequest.newBuilder()

        // Sends the request and print out the returned response.
        HttpResponse<String> response = httpClient.send(request,

        System.out.println("Status Code: " + response.statusCode());
        System.out.println("Headers    : " + response.headers().toString());
        System.out.println("Body       : " + response.body());

Here is the content of the website that we read using the code snippet above:

Status Code: 200
Headers    : { {:status=[200], cf-cache-status=[DYNAMIC], cf-ray=[5875b78d5df2eb00-LAX], cf-request-id=[023d710c5b0000eb00b738f200000001], content-length=[116], content-type=[text/x-rst;charset=utf-8], date=[Tue, 21 Apr 2020 08:25:53 GMT], etag=["234b9a1fe19f125356a5396c8cc72d54493a2eef"], expect-ct=[max-age=604800, report-uri=""], server=[cloudflare], set-cookie=[__cfduid=d5bdb6d828be3bb85d0f1f4c2ff81041c1587457553; expires=Thu, 21-May-20 08:25:53 GMT; path=/;; HttpOnly; SameSite=Lax]} }
Body       : 

Hello, World! 👋

Thank you for trying out HTTPie 🥳

I hope this will become a friendship.