eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

Course – LJB – NPI EA (cat = Core Java)
announcement - icon

Code your way through and build up a solid, practical foundation of Java:

>> Learn Java Basics

Partner – LambdaTest – NPI EA (cat= Testing)
announcement - icon

Distributed systems often come with complex challenges such as service-to-service communication, state management, asynchronous messaging, security, and more.

Dapr (Distributed Application Runtime) provides a set of APIs and building blocks to address these challenges, abstracting away infrastructure so we can focus on business logic.

In this tutorial, we'll focus on Dapr's pub/sub API for message brokering. Using its Spring Boot integration, we'll simplify the creation of a loosely coupled, portable, and easily testable pub/sub messaging system:

>> Flexible Pub/Sub Messaging With Spring Boot and Dapr

eBook – Jackson – NPI (cat=Jackson)
announcement - icon

Jackson and JSON in Java, finally learn with a coding-first approach:

>> Download the eBook

1. Overview

An INI file is an initialization or configuration file for Windows or MS-DOS. They have plain text content which comprises key-value pairs in sections. While we may prefer to configure our applications with Java’s native .properties files or other formats, we may sometimes need to consume data from existing INI files.

In this tutorial, we’ll look at a couple of libraries that can help us. We’ll also look at a way to populate a POJO with data from our INI files.

2. Creating a Sample INI File

Let’s start with a sample INI file, sample.ini:

; for 16-bit app support
[fonts]
letter=bold
text-size=28

[background]
color=white

[RequestResult]
RequestCode=1

[ResponseResult]
ResultCode=0

This file has four sections, using a mixture of lower-case, kebab-case, and upper-camel-case for naming. It has values that are either strings or numeric.

3. Parsing an INI File Using ini4j

ini4j is a lightweight library for reading configuration out of INI files. It hasn’t been updated since 2015.

3.1. Installing ini4j

To be able to use the ini4j library, first, we should add its dependency in our pom.xml:

<dependency>
    <groupId>org.ini4j</groupId>
    <artifactId>ini4j</artifactId>
    <version>0.5.4</version>
</dependency>

3.2. Opening an INI File in ini4j

We can open an INI file in ini4j by constructing an Ini object:

File fileToParse = new File("sample.ini");
Ini ini = new Ini(fileToParse);

This object now contains the sections and keys.

3.3. Reading a Section Key

We can read a key in a section from our INI file with the get() function on the Ini class:

assertThat(ini.get("fonts", "letter"))
  .isEqualTo("bold");

3.4. Converting to a Map

Let’s see how easy it is to convert the whole INI file into Map<String, Map<String, String>>, which is a Java native data structure that represents the hierarchy of an INI file:

public static Map<String, Map<String, String>> parseIniFile(File fileToParse)
  throws IOException {
    Ini ini = new Ini(fileToParse);
    return ini.entrySet().stream()
      .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
}

Here, the entrySet of the Ini object is essentially a key-value pair of String and Map<String, String>. The internal representation of Ini is pretty much a Map, so it’s easily converted into a plain Map by using stream() and the toMap() collector.

We can now read sections from this map with get():

assertThat(result.get("fonts").get("letter"))
  .isEqualTo("bold");

The Ini class is very easy to use out of the box, and converting to a Map may not be necessary, though we’ll find a use for that later.

However, ini4j is an old library and does not look to be well-maintained. Let’s consider another option.

4. Parsing an INI File Using Apache Commons

Apache Commons has a more sophisticated tool for processing INI files. This is capable of modeling the whole file for read and write, though we’ll focus only on its parsing capabilities.

4.1. Installing Commons Configuration

Let’s start by adding the required dependency in our pom.xml:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-configuration2</artifactId>
    <version>2.8.0</version>
</dependency>

Version 2.8.0 was updated in 2022, which is more recent than ini4j.

4.2. Opening an INI File

We can open an INI file by declaring an INIConfiguration object and passing it a Reader:

INIConfiguration iniConfiguration = new INIConfiguration();
try (FileReader fileReader = new FileReader(fileToParse)) {
    iniConfiguration.read(fileReader);
}

Here we’ve used the try-with-resources pattern to open a FileReader and then asked the INIConfiguration object to read it with the read function.

4.3. Reading a Section Key

The INIConfiguration class has a getSection() function to read a section and a getProperty() function on the returned object to read a key:

String value = iniConfiguration.getSection("fonts")
  .getProperty("letter")
  .toString();
assertThat(value)
  .isEqualTo("bold");

We should note that getProperty() returns Object rather than String, so needs to be converted to a String.

4.4. Converting to Map

We can also convert the INIConfiguration into a Map as before. This is a bit more complex than with ini4j:

Map<String, Map<String, String>> iniFileContents = new HashMap<>();

for (String section : iniConfiguration.getSections()) {
    Map<String, String> subSectionMap = new HashMap<>();
    SubnodeConfiguration confSection = iniConfiguration.getSection(section);
    Iterator<String> keyIterator = confSection.getKeys();
    while (keyIterator.hasNext()) {
        String key = keyIterator.next();
        String value = confSection.getProperty(key).toString();
        subSectionMap.put(key, value);
    }
    iniFileContents.put(section, subSectionMap);
}

To get all of the sections, we need to use getSections() to find their names. Then getSection() can give us each section.

We can then use the Iterator that provides all the keys for the section and use getProperty() with each to get the key-value pairs.

While a Map is harder to produce here, the advantage of the plainer data structure is that we can hide the INI file parsing from other parts of the system. Or, we could convert the configuration into POJOs.

5. Convert INI File to POJO

We can use Jackson to convert our Map structure into a POJO. We can decorate our POJO with deserialization annotations to help Jackson make sense of the various naming conventions in the original INI file. A POJO is easier to use than any of the data structures we’ve seen so far.

5.1. Import Jackson

We need to add Jackson to our pom.xml:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.2</version>
</dependency>

5.2. Defining Some POJOs

The fonts section of our sample file uses kebab-case for its properties. Let’s define a class to represent that section:

@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public static class Fonts {
    private String letter;
    private int textSize;

    // getters and setters
}

Here we’ve used the JsonNaming annotation to describe the case used in the properties.

Similarly, the RequestResult section has properties that use upper-camel-case:

@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
public static class RequestResult {
    private int requestCode;

    // getters and setters
}

The section names themselves are a variety of cases, so we can declare each section in our parent object, using the JsonProperty annotation to show deviations from the default lower-camel-case naming:

public class MyConfiguration {
    private Fonts fonts;
    private Background background;

    @JsonProperty("RequestResult")
    private RequestResult requestResult;

    @JsonProperty("ResponseResult")
    private ResponseResult responseResult;

    // getters and setters
}

5.3. Convert from Map to POJO

Now we have the ability to use either of our libraries to read an INI file as a Map and the ability to model the contents of the file as a POJO, we can use a Jackson ObjectMapper to perform the conversion:

ObjectMapper objectMapper = new ObjectMapper();
Map<String, Map<String, String>> iniKeys = parseIniFile(TEST_FILE);
MyConfiguration config = objectMapper.convertValue(iniKeys, MyConfiguration.class);

Let’s check that the whole file was loaded correctly:

assertThat(config.getFonts().getLetter()).isEqualTo("bold");
assertThat(config.getFonts().getTextSize()).isEqualTo(28);
assertThat(config.getBackground().getColor()).isEqualTo("white");
assertThat(config.getRequestResult().getRequestCode()).isEqualTo(1);
assertThat(config.getResponseResult().getResultCode()).isZero();

We should note that numeric properties, such as textSize and requestCode have been loaded into our POJO as numbers.

6. Comparison of Libraries and Approaches

The ini4j library is very simple to use and is essentially a simple Map-like structure. However, this is an older library without regular updates.

The Apache Commons solution is fuller featured and has regular updates but requires a little more work to use.

7. Conclusion

In this article, we saw how to read INI files using a couple of open-source libraries. We saw how to read individual keys and how to iterate over the whole file to produce a Map.

Then we saw how we can convert from Map to POJO using Jackson.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

eBook Jackson – NPI EA – 3 (cat = Jackson)
eBook Jackson – NPI (cat = Jackson)
2 Comments
Oldest
Newest
Inline Feedbacks
View all comments