Reading a specific line from a text file in Java
Asked Answered
H

9

21

Is there any method to read a specific line from a text file ? In the API or Apache Commons. Something like :

String readLine(File file, int lineNumber)

I agree it's trivial to implement, but it's not very efficient specially if the file is very big.

Harper answered 26/1, 2010 at 9:12 Comment(0)
L
17
String line = FileUtils.readLines(file).get(lineNumber);

would do, but it still has the efficiency problem.

Alternatively, you can use:

 LineIterator it = IOUtils.lineIterator(
       new BufferedReader(new FileReader("file.txt")));
 for (int lineNumber = 0; it.hasNext(); lineNumber++) {
    String line = (String) it.next();
    if (lineNumber == expectedLineNumber) {
        return line;
    }
 }

This will be slightly more efficient due to the buffer.

Take a look at Scanner.skip(..) and attempt skipping whole lines (with regex). I can't tell if it will be more efficient - benchmark it.

P.S. with efficiency I mean memory efficiency

Lowbred answered 26/1, 2010 at 9:17 Comment(5)
What is FileUtils? Is it from Java 7?Cavort
Efficiency? I think the real problem is that the first solution reads the whole file to memory...Goodyear
yes, that's why it has an efficiency problem, a memory efficiency problem in particular.Lowbred
The input file can have thousands of lines (documents to be loaded in the DB) therefore reading the whole file into memory is discarded.Harper
should be new FileReader(..) , just a heads up.Everybody
L
5

Not that I'm aware of.

Be aware that there's no particular indexing on files as to where the line starts, so any utility method would be exactly as efficient as:

BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
   r.readLine();
}
return r.readLine();

(with appropriate error-handling and resource-closing logic, of course).

Lamellate answered 26/1, 2010 at 9:18 Comment(0)
F
1

If the lines you were reading were all the same length, then a calculation might be useful.

But in the situation when the lines are different lengths, I don't think there's an alternative to reading them one at a time until the line count is correct.

Fante answered 26/1, 2010 at 9:18 Comment(2)
And "same length" means same length in bytes, not characters (with variable length character encoding in mind)Astound
Actually the input file is fixed length and ANSI, I forget to specify this in the question. The problem could be the line separator, the application must run both in Windows and Unix.Harper
S
1

Unfortunately, unless you can guarantee that every line in the file is the exact same length, you're going to have to read through the whole file, or at least up to the line you're after.

The only way you can count the lines is to look for the new line characters in the file, and this means you're going to have to read each byte.

It will be possible to optimise your code to make it neat and readable, but underneath you'll always be reading the whole file.

If you're going to reading the same file over and over again you could parse the file and create an index storing the offsets of certain line numbers, for example the byte count of where lines 100, 200 and so on are.

Spock answered 26/1, 2010 at 9:19 Comment(0)
P
1

Because files are byte and not line orientated - any general solutions complexity will be O(n) at best with n being the files size in bytes. You have to scan the whole file and count the line delimiters until you know which part of the file you want to read.

Proceeds answered 26/1, 2010 at 9:20 Comment(0)
C
1

guava has something similar:

List<String> Files.readLines(File file, Charset charset);

So you can do

String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
Cavort answered 26/1, 2010 at 9:21 Comment(0)
M
1

Using File Utils:

File fileFeatures = new File(
                "Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
Metallo answered 14/9, 2015 at 15:39 Comment(0)
I
0

If you are going to work with the same file in the same way (looking for a text at certain line) you can index your file. Line number -> offset.

Iconolatry answered 26/1, 2010 at 9:18 Comment(0)
V
0

According to this answer, Java 8 enables us to extract specific lines from a file. Examples are provided in that answer.

Variegation answered 12/4, 2016 at 19:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.