In this tutorial we’ll explore different ways to read from a File in Java; we’ll make use ofBufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream andFileChannel.
Then,we will discuss how to read a UTF-8 encoded file and how to create String from contents of a file.
Finally,we’ll explore the new techniques to read from file in Java 7.
This article is part of here on Baeldung.
Let’s start with a simple way to read from file using BufferedReader; the file itself contains:
The following code reads from the file using BufferedReader:
Note that readLine() will return null when the end of the file is reached.
Next,let’s use a Scanner to read from the File – the file contains:
We’ll use a simple whitespace as the delimiter:
Note that the default delimiter is the whitespace,but multiple delimiters can be used with aScanner.
Next,let’s read a text file into tokens using a StreamTokenizer.
The way the tokenizer works is – first,we need to figure out what the next token is – String or number; we do that by looking at the tokenizer.ttype field.
Then,we’ll read the actual token based on this type:
The file simply contains:
The following code reads from the file both the String and the number:
Note how the end of file token is used at the end.
We can use DataInputStream to read binary or primitive data type from file.
Let’s start with the actual file itself:
The following test reads the file using a DataInputStream:
Now,let’s look at how to concatenate two input streams into one usingSequenceInputStream; the 2 input files will simply contain:
Let’s now use a SequenceInputStream to read the two files and merge them into one:
If we are reading a large file, FileChannel can be faster than standard IO.
The contents of the file:
The following code reads data bytes from the file using FileChannel and RandomAccessFile:
Now,let’s see how to read a UTF-8 encoded file using BufferedReader:
We can make good use of StringBuilder to read the entire contents of a file into a String. Let’s start with the file:
The following code append data read from the file into a StringBuilder line by line:
Java 7 introduces a new way of working with files and the filesystem – let’s make use of that to read files.
The file contents:
The output in the file will be:
We can then append a String to the existing file:
The file will then be:
Next – let’s see how we can use a PrintWriter to write formatted text to a file:
The resulting file will contain:
Note how we’re not only writing a raw String to file,but also some formatted text with theprintf method.
We can create the writer using FileWriter, BufferedWriter or even System.out.
Let’s now see how we can use FileOutputStream to write binary data to a file. The following code converts a String int bytes and writes the bytes to file using aFileOutputStream:
The output in the file will of course be:
Next – let’s take a look at how we can use a DataOutputStream to write a String to file:
Let’s now illustrate how to write and edit inside an existing file – rather than just writing to a completely new file or appending to an existing one. Simply put – we need random access.
RandomAccessFile enable us to write at a specific position in the file given the offset – from the beginning of the file – in bytes. The following code writes an integer value with offset given from the beginning of the file:
If we want to read the int stored at specific location,we can use the following method:
To test our functions,let’s write an integer – edit it – and,finally,read it back:
If you are dealing with large files, FileChannel can be faster than standard IO. The following code write String to a file using FileChannel:
Java 7 introduces a new way of working with the filesystem,along with a new utility class –Files. Using the Files class,we can create,move,copy,delete files and directories as well; it also can be used to read and write to a file:
Now,let’s try to write to temporary file. The following code creates a temporary file and writes a String to it:
So,as you can see – it’s just the creation of the temporary file that is interesting and different – after that point,writing to the file is the same.
Finally,when writing to a file,you sometimes need to make extra sure that no one else is writing to that file at the same time. Basically – you need to be able to lock that file while writing.
Let’s make use of the FileChannel to try locking the file before writing to it: