Back to Java
2026-02-086 min read

Java File IO

Learn Java File IO step by step with clear examples and exercises.

Title: Java File I/O - Mastering Input and Output Operations

Why This Matters

Java File I/O is a fundamental skill for any Java developer as it allows interaction with files on your system. This skill is essential for reading and writing data to files, which is often required in real-world applications like logging, saving user preferences, or handling large datasets. Understanding Java File I/O can also help you during interviews, as it's a common topic in Java programming interviews.

Prerequisites

Before diving into Java File I/O, you should have a good understanding of the following concepts:

  • Basic Java syntax and control structures (loops, conditionals)
  • Classes and Objects in Java
  • Exception handling in Java
  • Understanding streams and their roles in Java I/O

Core Concept

Java provides several classes to perform Input/Output operations. The most commonly used classes are File, InputStreamReader, OutputStreamWriter, BufferedReader, and BufferedWriter.

File

The java.io.File class represents files and directories in the file system. You can use it to check if a file exists, get its properties like name, size, and last modified date, or create new ones.

import java.io.File;

File myFile = new File("myfile.txt"); // creates a File object for "myfile.txt" in the current directory

InputStreamReader & OutputStreamWriter

InputStreamReader and OutputStreamWriter are used to read from and write to files, respectively. They operate directly on the file system without buffering, which can lead to slower performance when dealing with large files. To improve performance, we use their buffered counterparts: BufferedReader and BufferedWriter.

import java.io.FileReader; // for reading text files
import java.io.FileWriter; // for writing text files
import java.io.InputStreamReader; // for reading binary files (e.g., images)
import java.io.OutputStreamWriter; // for writing binary files (e.g., images)

BufferedReader & BufferedWriter

To improve performance when dealing with large files, Java provides BufferedReader and BufferedWriter. These classes buffer data before writing it to the file system, reducing the number of disk operations and improving speed.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader; // for reading text files
import java.io.FileWriter; // for writing text files

// Reading a file using BufferedReader
BufferedReader br = new BufferedReader(new FileReader("myfile.txt")); // reads "myfile.txt" in the current directory with buffering
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // prints each line of the file
}
br.close();

// Writing to a file using BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter("myfile.txt")); // writes to "myfile.txt" in the current directory with buffering
bw.write("Hello, World!"); // writes the string to the file
bw.newLine(); // adds a new line after writing the string
bw.write("Goodbye, World!"); // writes another line to the file
bw.close();

Common Mistakes

  1. Not closing streams: Always remember to close your input and output streams using close(). Failing to do so can lead to resource leaks.
FileReader fr = new FileReader("myfile.txt"); // opens the file for reading
// ... read data from the file ...
fr.close(); // closes the file after reading
  1. Forgetting to handle exceptions: When working with files, it's important to handle potential exceptions like FileNotFoundException and IOException. You can use a try-catch block to do this.
import java.io.FileReader; // for reading text files
import java.io.FileNotFoundException;
import java.io.IOException;

FileReader fr = new FileReader("myfile.txt"); // opens the file for reading
try {
int data;
while ((data = fr.read()) != -1) {
System.out.print((char) data); // prints the content of the file
}
} catch (FileNotFoundException e) {
System.err.println("The file was not found.");
} catch (IOException e) {
System.err.println("An error occurred while reading the file.");
} finally {
try {
if (fr != null) {
fr.close(); // closes the file after reading
}
} catch (IOException ex) {
System.err.println("An error occurred while closing the file.");
}
}
  1. Not checking if a file exists before trying to read or write it: Always check if a file exists using the exists() method of the File class before attempting to read or write it.

Worked Example

Let's create a simple example that reads a text file and counts the number of words in it:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class WordCounter {
public static void main(String[] args) throws IOException {
File file = new File("words.txt"); // the file to read

if (!file.exists()) {
System.err.println("The file does not exist.");
return;
}

BufferedReader reader = new BufferedReader(new FileReader(file));
int wordCount = 0;

String line;
while ((line = reader.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
wordCount++;
tokenizer.nextToken();
}
}

System.out.println("The number of words in the file is: " + wordCount);
reader.close();
}
}

Common Mistakes

  1. Not checking if a file exists before reading it: This can lead to FileNotFoundException.
  2. Not closing the file after reading or writing: Failing to close the file can result in resource leaks.
  3. Forgetting to handle exceptions: Not handling exceptions can cause your program to crash unexpectedly.
  4. Not using buffered readers and writers for large files: Using unbuffered readers and writers can lead to slower performance when dealing with large files.
  5. Not properly reading lines or tokens from the file: Improper reading methods can result in incorrect data processing.

Practice Questions

  1. Write a Java program that reads a text file and counts the number of lines in it.
  2. Write a Java program that writes a list of names to a file, one per line. The user should be able to enter as many names as they want.
  3. Modify the previous exercise to read the names from a file and display them on the console.
  4. Write a Java program that copies the contents of one file to another.
  5. Write a Java program that reads a text file, counts the number of occurrences of each word in the file, and displays the results.
  6. Write a Java program that reads a binary file (e.g., an image), modifies it, and writes the modified version back to the same file or another file.

FAQ

What is the difference between FileReader and BufferedReader?

  • FileReader reads directly from a file without buffering, while BufferedReader buffers data before reading it, improving performance when dealing with large files.

Why should I close my input and output streams after using them?

  • Closing your input and output streams helps to free up system resources and avoid resource leaks.

What is the best way to handle exceptions when working with files in Java?

  • Use a try-catch block to handle potential exceptions like FileNotFoundException and IOException. You can also use a finally block to ensure that your file streams are closed properly, even if an exception occurs.

How do I read binary files in Java?

  • To read binary files in Java, you can use the InputStreamReader class for text files or the FileInputStream class for binary files like images.

What is the difference between OutputStreamWriter and BufferedWriter when writing to a file?

  • Both OutputStreamWriter and BufferedWriter can be used to write data to a file, but BufferedWriter provides buffering for improved performance with large files.

How do I read lines from a text file in Java without using the readLine() method?

  • You can use the BufferedReader.readLineSeparator() method to read line separators and then read characters until you encounter a newline character. Alternatively, you can use the StringTokenizer class to split the contents of the file into lines.
Java File IO | Java | XQA Learn