- How to Read a File in Java
- 1. Overview
- Further reading:
- Java — Create a File
- Java — Write to File
- 2. Setup
- 2.1. Input File
- 2.2. Helper Method
- 3. Reading a File from the Classpath
- 3.1. Using Standard Java
- 3.2. Using the commons-io Library
- 4. Reading with BufferedReader
- 5. Reading from a File Using Java NIO
- 5.1. Reading a Small File
- 5.2. Reading a Large File
- @Test public void givenFilePath_whenUsingFilesLines_thenFileData() < String expectedData = "Hello, world!"; Path path = Paths.get(getClass().getClassLoader() .getResource("fileTest.txt").toURI()); Streamlines = Files.lines(path); String data = lines.collect(Collectors.joining("\n")); lines.close(); Assert.assertEquals(expectedData, data.trim()); >
- 6. Reading with Scanner
- 7. Reading with StreamTokenizer
- 8. Reading with DataInputStream
- 9. Reading with FileChannel
- 10. Reading a UTF-8 Encoded File
- 11. Reading Content from URL
- 12. Reading a File from a JAR
- 13. Conclusion
How to Read a File in Java
The Kubernetes ecosystem is huge and quite complex, so it’s easy to forget about costs when trying out all of the exciting tools.
To avoid overspending on your Kubernetes cluster, definitely have a look at the free K8s cost monitoring tool from the automation platform CAST AI. You can view your costs in real time, allocate them, calculate burn rates for projects, spot anomalies or spikes, and get insightful reports you can share with your team.
Connect your cluster and start monitoring your K8s costs right away:
We rely on other people’s code in our own work. Every day.
It might be the language you’re writing in, the framework you’re building on, or some esoteric piece of software that does one thing so well you never found the need to implement it yourself.
The problem is, of course, when things fall apart in production — debugging the implementation of a 3rd party library you have no intimate knowledge of is, to say the least, tricky.
Lightrun is a new kind of debugger.
It’s one geared specifically towards real-life production environments. Using Lightrun, you can drill down into running applications, including 3rd party dependencies, with real-time logs, snapshots, and metrics.
Learn more in this quick, 5-minute Lightrun tutorial:
Slow MySQL query performance is all too common. Of course it is. A good way to go is, naturally, a dedicated profiler that actually understands the ins and outs of MySQL.
The Jet Profiler was built for MySQL only, so it can do things like real-time query performance, focus on most used tables or most frequent queries, quickly identify performance issues and basically help you optimize your queries.
Critically, it has very minimal impact on your server’s performance, with most of the profiling work done separately — so it needs no server changes, agents or separate services.
Basically, you install the desktop application, connect to your MySQL server, hit the record button, and you’ll have results within minutes:
DbSchema is a super-flexible database designer, which can take you from designing the DB with your team all the way to safely deploying the schema.
The way it does all of that is by using a design model, a database-independent image of the schema, which can be shared in a team using GIT and compared or deployed on to any database.
And, of course, it can be heavily visual, allowing you to interact with the database using diagrams, visually compose queries, explore the data, generate random data, import data or build HTML5 database reports.
The Kubernetes ecosystem is huge and quite complex, so it’s easy to forget about costs when trying out all of the exciting tools.
To avoid overspending on your Kubernetes cluster, definitely have a look at the free K8s cost monitoring tool from the automation platform CAST AI. You can view your costs in real time, allocate them, calculate burn rates for projects, spot anomalies or spikes, and get insightful reports you can share with your team.
Connect your cluster and start monitoring your K8s costs right away:
We’re looking for a new Java technical editor to help review new articles for the site.
1. Overview
In this tutorial, we’ll explore different ways to read from a File in Java.
First, we’ll learn how to load a file from the classpath, a URL, or from a JAR file using standard Java classes.
Second, we’ll see how to read the content with BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream, and FileChannel. We will also discuss how to read a UTF-8 encoded file.
Finally, we’ll explore the new techniques to load and read a file in Java 7 and Java 8.
This article is part of the “Java – Back to Basic” series on Baeldung.
Further reading:
Java — Create a File
Java — Write to File
2. Setup
2.1. Input File
In most examples throughout this article, we’ll read a text file with filename fileTest.txt that contains one line:
For a few examples, we’ll use a different file; in these cases, we’ll mention the file and its contents explicitly.
2.2. Helper Method
We’ll use a set of test examples with core Java classes only, and in the tests, we’ll use assertions with Hamcrest matchers.
Tests will share a common readFromInputStream method that transforms an InputStream to String for easier asserting of results:
private String readFromInputStream(InputStream inputStream) throws IOException < StringBuilder resultStringBuilder = new StringBuilder(); try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) < String line; while ((line = br.readLine()) != null) < resultStringBuilder.append(line).append("\n"); >> return resultStringBuilder.toString(); >
Note that there are other ways of achieving this same result. We can consult this article for some alternatives.
3. Reading a File from the Classpath
3.1. Using Standard Java
This section explains how to read a file that is available on a classpath. We’ll read the “ fileTest.txt ” available under src/main/resources :
@Test public void givenFileNameAsAbsolutePath_whenUsingClasspath_thenFileData() < String expectedData = "Hello, world!"; Class clazz = FileOperationsTest.class; InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt"); String data = readFromInputStream(inputStream); Assert.assertThat(data, containsString(expectedData)); >
In the above code snippet, we used the current class to load a file using getResourceAsStream method and passed the absolute path of the file to load.
The same method is available on a ClassLoader instance as well:
ClassLoader classLoader = getClass().getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream("fileTest.txt"); String data = readFromInputStream(inputStream);
We obtain the classLoader of the current class using getClass().getClassLoader() .
The main difference is that when using the getResourceAsStream on a ClassLoader instance, the path is treated as absolute starting from the root of the classpath.
When used against a Class instance , the path could be relative to the package, or an absolute path, which is hinted by the leading slash.
Of course, note that in practice, open streams should always be closed, such as the InputStream in our example:
InputStream inputStream = null; try < File file = new File(classLoader.getResource("fileTest.txt").getFile()); inputStream = new FileInputStream(file); //. >finally < if (inputStream != null) < try < inputStream.close(); >catch (IOException e) < e.printStackTrace(); >> >
3.2. Using the commons-io Library
Another common option is using the FileUtils class of the commons-io package:
@Test public void givenFileName_whenUsingFileUtils_thenFileData()
Here we pass the File object to the method readFileToString() of FileUtils class. This utility class manages to load the content without the necessity of writing any boilerplate code to create an InputStream instance and read data.
The same library also offers the IOUtils class:
@Test public void givenFileName_whenUsingIOUtils_thenFileData() < String expectedData = "Hello, world!"; FileInputStream fis = new FileInputStream("src/test/resources/fileTest.txt"); String data = IOUtils.toString(fis, "UTF-8"); assertEquals(expectedData, data.trim()); >
Here we pass the FileInputStream object to the method toString() of IOUtils class. This utility class acts in the same way as the previous one in order to create an InputStream instance and read data.
4. Reading with BufferedReader
Now let’s focus on different ways to parse the content of a file.
We’ll start with a simple way to read from a file using BufferedReader:
@Test public void whenReadWithBufferedReader_thenCorrect() throws IOException < String expected_value = "Hello, world!"; String file ="src/test/resources/fileTest.txt"; BufferedReader reader = new BufferedReader(new FileReader(file)); String currentLine = reader.readLine(); reader.close(); assertEquals(expected_value, currentLine); >
Note that readLine() will return null when the end of the file is reached.
5. Reading from a File Using Java NIO
In JDK7, the NIO package was significantly updated.
Let’s look at an example using the Files class and the readAllLines method. The readAllLines method accepts a Path.
Path class can be considered an upgrade of the java.io.File with some additional operations in place.
5.1. Reading a Small File
The following code shows how to read a small file using the new Files class:
@Test public void whenReadSmallFileJava7_thenCorrect() throws IOException < String expected_value = "Hello, world!"; Path path = Paths.get("src/test/resources/fileTest.txt"); String read = Files.readAllLines(path).get(0); assertEquals(expected_value, read); >
Note that we can use the readAllBytes() method as well if we need binary data.
5.2. Reading a Large File
If we want to read a large file with Files class, we can use the BufferedReader.
The following code reads the file using the new Files class and BufferedReader:
@Test public void whenReadLargeFileJava7_thenCorrect() throws IOException < String expected_value = "Hello, world!"; Path path = Paths.get("src/test/resources/fileTest.txt"); BufferedReader reader = Files.newBufferedReader(path); String line = reader.readLine(); assertEquals(expected_value, line); >
@Test public void givenFilePath_whenUsingFilesLines_thenFileData() < String expectedData = "Hello, world!"; Path path = Paths.get(getClass().getClassLoader() .getResource("fileTest.txt").toURI()); Streamlines = Files.lines(path); String data = lines.collect(Collectors.joining("\n")); lines.close(); Assert.assertEquals(expectedData, data.trim()); >
Using Stream with IO channels like file operations, we need to close the stream explicitly using the close() method.
As we can see, the Files API offers another easy way to read the file contents into a String.
In the next sections, we’ll look at other less common methods of reading a file that may be appropriate in some situations.
6. Reading with Scanner
Next let’s use a Scanner to read from the File. Here we’ll use whitespace as the delimiter:
@Test public void whenReadWithScanner_thenCorrect() throws IOException < String file = "src/test/resources/fileTest.txt"; Scanner scanner = new Scanner(new File(file)); scanner.useDelimiter(" "); assertTrue(scanner.hasNext()); assertEquals("Hello,", scanner.next()); assertEquals("world!", scanner.next()); scanner.close(); >
Note that the default delimiter is the whitespace, but multiple delimiters can be used with a Scanner.
The Scanner class is useful when reading content from the console, or when the content contains primitive values, with a known delimiter (eg: a list of integers separated by space).
7. Reading with StreamTokenizer
Now let’s read a text file into tokens using a StreamTokenizer.
The tokenizer works by first figuring 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:
In this example, we’ll use a different input file which simply contains:
The following code reads from the file both the String and the number:
@Test public void whenReadWithStreamTokenizer_thenCorrectTokens() throws IOException < String file = "src/test/resources/fileTestTokenizer.txt"; FileReader reader = new FileReader(file); StreamTokenizer tokenizer = new StreamTokenizer(reader); // token 1 tokenizer.nextToken(); assertEquals(StreamTokenizer.TT_WORD, tokenizer.ttype); assertEquals("Hello", tokenizer.sval); // token 2 tokenizer.nextToken(); assertEquals(StreamTokenizer.TT_NUMBER, tokenizer.ttype); assertEquals(1, tokenizer.nval, 0.0000001); // token 3 tokenizer.nextToken(); assertEquals(StreamTokenizer.TT_EOF, tokenizer.ttype); reader.close(); >
Note how the end of file token is used at the end.
This approach is useful for parsing an input stream into tokens.
8. Reading with DataInputStream
We can use DataInputStream to read binary or primitive data types from a file.
The following test reads the file using a DataInputStream:
@Test public void whenReadWithDataInputStream_thenCorrect() throws IOException < String expectedValue = "Hello, world!"; String file ="src/test/resources/fileTest.txt"; String result = null; DataInputStream reader = new DataInputStream(new FileInputStream(file)); int nBytesToRead = reader.available(); if(nBytesToRead >0) < byte[] bytes = new byte[nBytesToRead]; reader.read(bytes); result = new String(bytes); >assertEquals(expectedValue, result); >
9. Reading with FileChannel
If we are reading a large file, FileChannel can be faster than standard IO.
The following code reads data bytes from the file using FileChannel and RandomAccessFile:
@Test public void whenReadWithFileChannel_thenCorrect() throws IOException < String expected_value = "Hello, world!"; String file = "src/test/resources/fileTest.txt"; RandomAccessFile reader = new RandomAccessFile(file, "r"); FileChannel channel = reader.getChannel(); int bufferSize = 1024; if (bufferSize >channel.size()) < bufferSize = (int) channel.size(); >ByteBuffer buff = ByteBuffer.allocate(bufferSize); channel.read(buff); buff.flip(); assertEquals(expected_value, new String(buff.array())); channel.close(); reader.close(); >
10. Reading a UTF-8 Encoded File
Now let’s see how to read a UTF-8 encoded file using BufferedReader. In this example, we’ll read a file that contains Chinese characters:
@Test public void whenReadUTFEncodedFile_thenCorrect() throws IOException < String expected_value = "青空"; String file = "src/test/resources/fileTestUtf8.txt"; BufferedReader reader = new BufferedReader (new InputStreamReader(new FileInputStream(file), "UTF-8")); String currentLine = reader.readLine(); reader.close(); assertEquals(expected_value, currentLine); >
11. Reading Content from URL
To read content from a URL, we will use “/” URL in our example:
@Test public void givenURLName_whenUsingURL_thenFileData() < String expectedData = "Baeldung"; URL urlObject = new URL("/"); URLConnection urlConnection = urlObject.openConnection(); InputStream inputStream = urlConnection.getInputStream(); String data = readFromInputStream(inputStream); Assert.assertThat(data, containsString(expectedData)); >
There are also alternative ways of connecting to a URL. Here we used the URL and URLConnection class available in the standard SDK.
12. Reading a File from a JAR
To read a file which is located inside a JAR file, we will need a JAR with a file inside it. For our example, we will read “LICENSE.txt” from the “hamcrest-library-1.3.jar” file:
@Test public void givenFileName_whenUsingJarFile_thenFileData() < String expectedData = "BSD License"; Class clazz = Matchers.class; InputStream inputStream = clazz.getResourceAsStream("/LICENSE.txt"); String data = readFromInputStream(inputStream); Assert.assertThat(data, containsString(expectedData)); >
Here we want to load LICENSE.txt that resides in Hamcrest library, so we will use the Matcher’s class that helps to get a resource. The same file can be loaded using the classloader too.
13. Conclusion
As we can see, there are many possibilities for loading a file and reading data from it using plain Java.
We can load a file from various locations like classpath, URL, or jar files.
Then we can use BufferedReader to read line by line, Scanner to read using different delimiters, StreamTokenizer to read a file into tokens, DataInputStream to read binary data and primitive data types, SequenceInput Stream to link multiple files into one stream, FileChannel to read faster from large files, etc.
We can find the source code for this article in the following GitHub repo .
Slow MySQL query performance is all too common. Of course it is. A good way to go is, naturally, a dedicated profiler that actually understands the ins and outs of MySQL.
The Jet Profiler was built for MySQL only, so it can do things like real-time query performance, focus on most used tables or most frequent queries, quickly identify performance issues and basically help you optimize your queries.
Critically, it has very minimal impact on your server’s performance, with most of the profiling work done separately — so it needs no server changes, agents or separate services.
Basically, you install the desktop application, connect to your MySQL server, hit the record button, and you’ll have results within minutes: