I need to perform a simple grep and other manipulations on large files in Java. I am not that familiar with the Java NIO utilities, but I am assuming that is what I need to use. What resources or helpful tips do you have for reading/writing large files. Also, I am working on a SWT application and need to display parts of that data within a text area on a GUI.
java.io.RandomAccessFile
uses long for file-pointer offset so should be able to cope. However, you should read a chunk at a time otherwise overheads will be high. FileInputStream
works similarly.
Java NIO shouldn't be too difficult. You don't need to mess around with Selector
s or similar. In fact, prior to JDK7 you can't select with files. However, avoid mapping files. There is no unmap, so if you try to do it lots you'll run out of address space on 32-bit systems, or run into other problems (NIO does attempt to call GC, but it's a bit of a hack).
Maybe a little bit off topic: Have a look on VFS by apache. It's originally meant to be a library for hiding the ftp-http-file-whatever system behind a file system facade from your application's point of view. I mentioning it here because I have positive experience with accessing large files (via ftp) for searching, reading, copying etc. (large in that context means > 15MB) with this library.
If all you are doing is reading the entire file a chunk at a time, with no special processing, then nio and java.io.RandomAccessFile
are probably overkill. Just read and process the content of the file a block at a time. Ensure that you use a BufferedInputStream
or BufferedReader
.
If you have to read the entire file to do what you are doing, and you read only one file at a time, then you will gain little benefit from nio.