Read and Writing to a file simultaneously in java

iphonedev7 picture iphonedev7 · Jan 23, 2013 · Viewed 14.9k times · Source

I'm reading a file line by line, and I am trying to make it so that if I get to a line that fits my specific parameters (in my case if it begins with a certain word), that I can overwrite that line.

My current code:

try {
    FileInputStream fis = new FileInputStream(myFile);
    DataInputStream in = new DataInputStream(fis);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String line;

    while ((line = br.readLine()) != null) {
        System.out.println(line);
            if (line.startsWith("word")) {
                // replace line code here
            }
    }
} catch (Exception ex) {
    ex.printStackTrace();
}

...where myFile is a File object.

As always, any help, examples, or suggestions are much appreciated.

Thanks!

Answer

meriton picture meriton · Jan 23, 2013

RandomAccessFile seems a good fit. Its javadoc says:

Instances of this class support both reading and writing to a random access file. A random access file behaves like a large array of bytes stored in the file system. There is a kind of cursor, or index into the implied array, called the file pointer; input operations read bytes starting at the file pointer and advance the file pointer past the bytes read. If the random access file is created in read/write mode, then output operations are also available; output operations write bytes starting at the file pointer and advance the file pointer past the bytes written. Output operations that write past the current end of the implied array cause the array to be extended. The file pointer can be read by the getFilePointer method and set by the seek method.

That said, since text files are a sequential file format, you can not replace a line with a line of a different length without moving all subsequent characters around, so to replace lines will in general amount to reading and writing the entire file. This may be easier to accomplish if you write to a separate file, and rename the output file once you are done. This is also more robust in case if something goes wrong, as one can simply retry with the contents of the initial file. The only advantage of RandomAccessFile is that you do not need the disk space for the temporary output file, and may get slight better performance out of the disk due to better access locality.