Using Text Files · Usando Arquivos de Texto
| English | Português |
|---|---|
| text file/tekst faɪl/ | arquivo de texto |
A blank line is not an invalid token
- A text file 文本文件 contains a blank line followed by
12. At the start, bothhasNextLine()and · e hasNextInt()are true: the integer-token check skips whitespace, including the blank line, to find 12. - Compare a file containing
oopsfollowed by12: it has another line, but its next token is not an integer. A line-presence check cannot establish integer format; choose a guard that matches the read.
With the default delimiter, a Scanner containing a blank line followed by 12 reports hasNextInt() as true at the start.
The integer-token check skips whitespace, including the blank line, and finds the integer token 12.
Attach the reader to its source
new Scanner(new File("scores.txt"))reads the named file, whereasnew Scanner(System.in)reads keyboard input. Both expose the same Scanner methods; the source and its availability differ.- Opening a missing file can throw
FileNotFoundException. The complete example below declares it onmain; a real application could instead catch it and report a useful error. Neither choice creates missing data.
To read a text file, you attach a Scanner to a...
new Scanner(new File("...")) reads a file.
The same Scanner methods (nextInt, nextLine) work for both keyboard and file input.
Only the source (System.in vs File) differs.
Read complete lines
hasNextLine()checks whether another line exists without consuming it;nextLine()consumes the remainder of that line and its line separator. A blank line can produce the empty string"".- For line-based records, use
while (in.hasNextLine()) { String line = in.nextLine(); ... }. Decide explicitly whether an empty record is meaningful, should be skipped, or should be reported as invalid.
Reading a text file · Lendo um arquivo de texto
Follow the steps a program takes to read a file line by line.
Which method checks whether there is another line to read?
hasNextLine() guards a nextLine() read.
You should check hasNextLine() before each call to nextLine().
Reading past the end throws an exception.
Read tokens with matching checks
- Scanner's default delimiter is whitespace.
hasNext()checks for a token;next()consumes it.hasNextInt()checks whether the next token can be read as an integer;nextInt()consumes that integer. while (in.hasNextInt())stops atoops, even if 12 follows. If the policy is to skip invalid tokens and retain later integers, loop withhasNext(), testhasNextInt(), and consume an invalid token withnext().
This complete program sums valid integer tokens and reports every skipped token. For a file containing oops followed by 12, it prints Skipped: oops and then Total: 12. The example assumes the sum fits in an int.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadScores {
public static void main(String[] args) throws FileNotFoundException {
int total = 0;
try (Scanner in = new Scanner(new File("scores.txt"))) {
while (in.hasNext()) {
if (in.hasNextInt()) {
total += in.nextInt();
} else {
System.out.println("Skipped: " + in.next());
}
}
}
System.out.println("Total: " + total);
}
}
Match each read to the guard that checks that kind of input.
A line-presence check is not an integer-format check.
Consume input and release the file
- Every branch in the token loop consumes a token. Repeatedly checking an invalid token without consuming it leaves the Scanner at the same position and can make a loop run forever.
- The try-with-resources block closes this file Scanner on exit, including exceptional exit. When managing it manually, call
close()when finished; checks do not replace closing the resource.
hasNextLine() followed by nextInt() is not a matching guard. A non-integer token can cause InputMismatchException, and that failed integer read leaves the token available. Choose whether to reject the file, report the record, or explicitly skip the token.
When you finish reading a file, you should...
in.close() releases the file.
Check the data policy before the loop
- For input
8 oops 12, a loop that reads only whilehasNextInt()totals 8 and stops atoops. The shown skip-and-report policy totals 20. An unexpected token need not mean the file has ended. - These policies answer different questions. For a required score per student, silently skipping a bad token could misalign records; prefer reporting and rejecting that record rather than treating all later tokens as interchangeable scores.
Choose line or token reading from the file format. Checks inspect upcoming input without consuming it; matching reads consume it. Handle invalid data explicitly, advance every loop branch, and close the file reader.
For input 8 oops 12, what total does the shown skip-and-report program print?
It consumes and adds 8, consumes and reports oops, then consumes and adds 12. The total is 20.