Search code examples
javajava-iofile-locking

Opening and reading from a file without locking it


I need to be able to mimic tail -f with Java. I'm trying to read a log file as it's being written by another process, but when I open the file to read it, it locks the file and the other process can't write to it anymore. Any help would be greatly appreciated!

Here is the code that I'm using currently:

public void read() {
    Scanner fp = null;
    try {
        fp = new Scanner(new FileReader(this.filename));
        fp.useDelimiter("\n");
    } catch (java.io.FileNotFoundException e) {
        System.out.println("java.io.FileNotFoundException e");
    }

    while (true) {
        if (fp.hasNext()) {
            this.parse(fp.next());
        }           
    }       
}

Solution

  • Rebuilding tail is tricky due to some special cases like file truncation and (intermediate) deletion. To open the file without locking, use StandardOpenOption.READ with the new Java file API:

    try (InputStream is = Files.newInputStream(path, StandardOpenOption.READ)) {
        InputStreamReader reader = new InputStreamReader(is, fileEncoding);
        BufferedReader lineReader = new BufferedReader(reader);
        // Process all lines.
        String line;
        while ((line = lineReader.readLine()) != null) {
            // Line content content is in variable line.
        }
    }
    

    For my attempt to create a tail in Java see:

    Feel free to take inspiration from that code or simply copy the parts you require. Let me know if you find any issues that I'm not aware of.