diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/filetomap/FileToHashMap.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/filetomap/FileToHashMap.java
new file mode 100644
index 0000000000..f88404a1a4
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/filetomap/FileToHashMap.java
@@ -0,0 +1,83 @@
+package com.baeldung.filetomap;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class FileToHashMap {
+
+    enum DupKeyOption {
+        OVERWRITE, DISCARD
+    }
+
+    public static Map<String, String> byBufferedReader(String filePath, DupKeyOption dupKeyOption) {
+        HashMap<String, String> map = new HashMap<>();
+        String line;
+        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
+            while ((line = reader.readLine()) != null) {
+                String[] keyValuePair = line.split(":", 2);
+                if (keyValuePair.length > 1) {
+                    String key = keyValuePair[0];
+                    String value = keyValuePair[1];
+                    if (DupKeyOption.OVERWRITE == dupKeyOption) {
+                        map.put(key, value);
+                    } else if (DupKeyOption.DISCARD == dupKeyOption) {
+                        map.putIfAbsent(key, value);
+                    }
+                } else {
+                    System.out.println("No Key:Value found in line, ignoring: " + line);
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    public static Map<String, String> byStream(String filePath, DupKeyOption dupKeyOption) {
+        Map<String, String> map = new HashMap<>();
+        try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
+            lines.filter(line -> line.contains(":"))
+                .forEach(line -> {
+                    String[] keyValuePair = line.split(":", 2);
+                    String key = keyValuePair[0];
+                    String value = keyValuePair[1];
+                    if (DupKeyOption.OVERWRITE == dupKeyOption) {
+                        map.put(key, value);
+                    } else if (DupKeyOption.DISCARD == dupKeyOption) {
+                        map.putIfAbsent(key, value);
+                    }
+                });
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    public static Map<String, List<String>> aggregateByKeys(String filePath) {
+        Map<String, List<String>> map = new HashMap<>();
+        try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
+            lines.filter(line -> line.contains(":"))
+                .forEach(line -> {
+                    String[] keyValuePair = line.split(":", 2);
+                    String key = keyValuePair[0];
+                    String value = keyValuePair[1];
+                    if (map.containsKey(key)) {
+                        map.get(key).add(value);
+                    } else {
+                        map.put(key, Stream.of(value).collect(Collectors.toList()));
+                    }
+                });
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+}
diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/filetomap/FileToHashMapUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/filetomap/FileToHashMapUnitTest.java
new file mode 100644
index 0000000000..c89f26de69
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/filetomap/FileToHashMapUnitTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.filetomap;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class FileToHashMapUnitTest {
+
+    private String filePath;
+
+    private static final Map<String, String> EXPECTED_MAP_DISCARD = Stream.of(new String[][]{
+        {"title", "The Lord of the Rings: The Return of the King"},
+        {"director", "Peter Jackson"},
+        {"actor", "Sean Astin"}
+    }).collect(Collectors.toMap(data -> data[0], data -> data[1]));
+
+    private static final Map<String, String> EXPECTED_MAP_OVERWRITE = Stream.of(new String[][]{
+        {"title", "The Lord of the Rings: The Return of the King"},
+        {"director", "Peter Jackson"},
+        {"actor", "Ian McKellen"}
+    }).collect(Collectors.toMap(data -> data[0], data -> data[1]));
+
+    private static final Map<String, List<String>> EXPECTED_MAP_AGGREGATE = Stream.of(new String[][]{
+        {"title", "The Lord of the Rings: The Return of the King"},
+        {"director", "Peter Jackson"},
+        {"actor", "Sean Astin", "Ian McKellen"}
+    }).collect(Collectors.toMap(arr -> arr[0], arr -> Arrays.asList(Arrays.copyOfRange(arr, 1, arr.length))));
+
+    @Before
+    public void setPath() throws URISyntaxException {
+        if (filePath == null) {
+            filePath = Paths.get(ClassLoader.getSystemResource("filetomap/theLordOfRings.txt").toURI()).toString();
+        }
+    }
+
+    @Test
+    public void givenInputFile_whenInvokeByBufferedReaderPriorToJava8_shouldGetExpectedMap() {
+        Map<String, String> mapOverwrite = FileToHashMap.byBufferedReader(filePath, FileToHashMap.DupKeyOption.OVERWRITE);
+        Map<String, String> mapDiscard = FileToHashMap.byBufferedReader(filePath, FileToHashMap.DupKeyOption.DISCARD);
+        assertThat(mapOverwrite).isEqualTo(EXPECTED_MAP_OVERWRITE);
+        assertThat(mapDiscard).isEqualTo(EXPECTED_MAP_DISCARD);
+    }
+
+    @Test
+    public void givenInputFile_whenInvokeByStream_shouldGetExpectedMap() {
+        Map<String, String> mapOverwrite = FileToHashMap.byStream(filePath, FileToHashMap.DupKeyOption.OVERWRITE);
+        Map<String, String> mapDiscard = FileToHashMap.byStream(filePath, FileToHashMap.DupKeyOption.DISCARD);
+        assertThat(mapOverwrite).isEqualTo(EXPECTED_MAP_OVERWRITE);
+        assertThat(mapDiscard).isEqualTo(EXPECTED_MAP_DISCARD);
+    }
+
+    @Test
+    public void givenInputFile_whenInvokeAggregateByKeys_shouldGetExpectedMap() {
+        Map<String, List<String>> mapAgg = FileToHashMap.aggregateByKeys(filePath);
+        assertThat(mapAgg).isEqualTo(EXPECTED_MAP_AGGREGATE);
+    }
+}
diff --git a/core-java-modules/core-java-io-4/src/test/resources/filetomap/theLordOfRings.txt b/core-java-modules/core-java-io-4/src/test/resources/filetomap/theLordOfRings.txt
new file mode 100644
index 0000000000..1ab069e533
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/resources/filetomap/theLordOfRings.txt
@@ -0,0 +1,6 @@
+title:The Lord of the Rings: The Return of the King
+director:Peter Jackson
+actor:Sean Astin
+actor:Ian McKellen
+Gandalf and Aragorn lead the World of Men against Sauron's
+army to draw his gaze from Frodo and Sam as they approach Mount Doom with the One Ring.
\ No newline at end of file