Java provides several ways to read the content of a file. We'll explore a few common methods, from using the classic Scanner to the modern java.nio API.
java.util.ScannerThe Scanner class is a simple and effective way to parse text from a file. It can read a file line by line or token by token.
To use it, you create a Scanner object and pass a File object to its constructor.
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner;public class Main { public static void main(String[] args) { try { File myObj = new File("filename.txt"); Scanner myReader = new Scanner(myObj); while (myReader.hasNextLine()) { String data = myReader.nextLine(); System.out.println(data); } myReader.close(); } catch (FileNotFoundException e) { System.out.println("An error occurred: File not found."); e.printStackTrace(); } } }
java.io.BufferedReaderFor reading large files efficiently, BufferedReader is an excellent choice. It reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.
It is often wrapped around a FileReader. Using try-with-resources is highly recommended.
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException;public class Main { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new FileReader("filename.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.err.println("Error reading file: " + e.getMessage()); } } }
java.nio.file.Files (Modern Approach)For small to medium-sized files, the modern NIO.2 API provides a very convenient one-liner to read all lines of a file into a List of strings.
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List;public class Main { public static void main(String[] args) { try { List<String> allLines = Files.readAllLines(Paths.get("filename.txt")); for (String line : allLines) { System.out.println(line); } } catch (IOException e) { System.err.println("Error reading file: " + e.getMessage()); } } }
Warning: Be careful using
Files.readAllLines()on very large files, as it will attempt to load the entire file content into memory, which could lead to anOutOfMemoryError. For large files, theBufferedReaderapproach is safer.
Which class is simple and effective for parsing text from a file line by line?