Reading Files in Java

Here’s the translation of the Go code example for reading files to Java, with explanations in Markdown format suitable for Hugo:

Reading and writing files are basic tasks needed for many Java programs. First we’ll look at some examples of reading files.

import java.io.*;
import java.nio.file.*;

public class ReadingFiles {

    // Reading files requires checking most calls for exceptions.
    // This helper will streamline our exception checks below.
    private static void check(Exception e) {
        if (e != null) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        // Perhaps the most basic file reading task is
        // slurping a file's entire contents into memory.
        try {
            String content = new String(Files.readAllBytes(Paths.get("/tmp/dat")));
            System.out.print(content);
        } catch (IOException e) {
            check(e);
        }

        // You'll often want more control over how and what
        // parts of a file are read. For these tasks, start
        // by creating a FileInputStream to obtain a file handle.
        try (FileInputStream fis = new FileInputStream("/tmp/dat")) {
            // Read some bytes from the beginning of the file.
            // Allow up to 5 to be read but also note how many
            // actually were read.
            byte[] b1 = new byte[5];
            int n1 = fis.read(b1);
            System.out.printf("%d bytes: %s\n", n1, new String(b1, 0, n1));

            // You can also seek to a known location in the file
            // and read from there.
            long skipped = fis.skip(6);
            byte[] b2 = new byte[2];
            int n2 = fis.read(b2);
            System.out.printf("%d bytes @ %d: ", n2, skipped);
            System.out.printf("%s\n", new String(b2, 0, n2));

            // The seek methods in Java are relative to the
            // current position or the beginning of the file.
            fis.getChannel().position(fis.getChannel().position() + 4);

            // There is no built-in rewind, but
            // seek(0) accomplishes this.
            fis.getChannel().position(0);

            // The BufferedReader class implements a buffered
            // reader that may be useful both for its efficiency
            // with many small reads and because of the additional
            // reading methods it provides.
            BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
            char[] b4 = new char[5];
            reader.mark(5);
            reader.read(b4, 0, 5);
            System.out.printf("5 bytes: %s\n", new String(b4));
            reader.reset();

        } catch (IOException e) {
            check(e);
        }
    }
}

To run this program:

$ echo "hello" > /tmp/dat
$ echo "java" >>   /tmp/dat
$ javac ReadingFiles.java
$ java ReadingFiles
hello
java
5 bytes: hello
2 bytes @ 6: ja
5 bytes: hello

This Java code demonstrates various methods of reading files, including reading entire files, reading specific bytes, seeking to positions in the file, and using buffered readers. The FileInputStream and BufferedReader classes are used for low-level and high-level file operations respectively.

Next, we’ll look at writing files.