Text files: write and read with Scanner · Arquivos de texto: escrever e ler com Scanner
Reading and writing text files
- A text file stores text that stays on disk after the program ends.
- To read a file in Java we use a
Scannerconnected to aFile. - To write a file we use a
PrintWriter. In this lesson each program writes a file, then reads it back. - Bonus lesson: the AP CSA exam does not test file input/output. Learn this for real programs — you will not be examined on it.
Lendo e escrevendo arquivos de texto
- Um arquivo de texto armazena texto que permanece em disco após o programa terminar.
- Para ler um arquivo em Java usamos um
Scannerconectado a umFile. - Para escrever um arquivo usamos um
PrintWriter. Nesta aula cada programa escreve um arquivo, depois lê ele de volta. - Aula bônus: a prova AP CSA não testa entrada/saída de arquivos. Aprenda isso para programas reais — você não será avaliado nisso.
Reading and writing a file · Lendo e escrevendo um arquivo
A file is used in three steps: open · abrir it, read or write lines, then close · fechar it. · Um arquivo é usado em três etapas: abrir ele, ler ou escrever linhas, depois fechar ele.
The imports you need
- File tools live in two places, so we import both at the top.
import java.io.*;— forFile,PrintWriter, andIOException.import java.util.Scanner;— for theScannerreader.
As imports que você precisa
- Ferramentas de arquivo vivem em dois lugares, então importamos ambos no topo.
import java.io.*;— paraFile,PrintWritereIOException.import java.util.Scanner;— para o leitorScanner.
import java.io.*;
import java.util.Scanner;
Files can fail, so we say throws IOException
- Reading or writing a file can go wrong (the file may be missing).
- Java makes you handle this. The simplest way is to add
throws IOExceptiontomain. - This says "if a file error happens, let the program stop". That is fine for these tasks.
Arquivos podem falhar, então dizemos throws IOException
- Ler ou escrever um arquivo pode dar errado (o arquivo pode estar ausente).
- Java exige que você lidisse com isso. A maneira mais simples é adicionar
throws IOExceptionamain. - Isso diz "se ocorrer um erro de arquivo, deixe o programa parar". Isso é bom para estas tarefas.
Writing a file with PrintWriter
new PrintWriter("data.txt")makes (or empties) a file calleddata.txt.- Use
writer.println(...)to write one line, just like printing to the screen. - Always call
writer.close()when you finish, so the text is saved.
Escrevendo um arquivo com PrintWriter
new PrintWriter("data.txt")cria (ou esvazia) um arquivo chamadodata.txt.- Use
writer.println(...)para escrever uma linha, assim como imprimir na tela. - Sempre chame
writer.close()quando terminar, para que o texto seja salvo.
import java.io.*;
public class WriteDemo {
public static void main(String[] args) throws IOException {
PrintWriter writer = new PrintWriter("data.txt");
writer.println(10);
writer.println(20);
writer.close(); // save the file
System.out.println("wrote data.txt");
}
}
Reading numbers with Scanner
new Scanner(new File("data.txt"))opens the file for reading.in.hasNextInt()istruewhile there is another whole number to read.in.nextInt()reads the next whole number. Callin.close()when done.
Lendo números com Scanner
new Scanner(new File("data.txt"))abre o arquivo para leitura.in.hasNextInt()étrueenquanto houver outro número inteiro para ler.in.nextInt()lê o próximo número inteiro. Chamein.close()quando terminar.
import java.io.*;
import java.util.Scanner;
public class ReadNumbers {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(new File("data.txt"));
int total = 0;
while (in.hasNextInt()) { // more numbers?
total = total + in.nextInt();
}
in.close();
System.out.println(total);
}
}
Reading whole lines
- Sometimes a line is text, not a number. Then read lines instead.
in.hasNextLine()istruewhile there is another line.in.nextLine()reads the whole next line as aString.
Lendo linhas inteiras
- Às vezes uma linha é texto, não um número. Então leia linhas em vez disso.
in.hasNextLine()étrueenquanto houver outra linha.in.nextLine()lê a próxima linha inteira como umString.
hasNext()(noIntorLine) checks for the next word, andnext()reads one word.- The pattern is always: check with a
hasNext...method, then read with the matching method.
import java.io.*;
import java.util.Scanner;
public class ReadLines {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(new File("data.txt"));
while (in.hasNextLine()) {
String line = in.nextLine();
System.out.println("read: " + line);
}
in.close();
}
}
hasNext()(semIntouLine) verifica a próxima palavra, enext()lê uma palavra.- O padrão é sempre: verifique com um método
hasNext..., depois leia com o método correspondente.
Write then read in one program
- In each task your program first writes a file, then reads the same file back.
- This means you can run it again and again and get the same result.
Escreva e leia em um único programa
- Em cada tarefa seu programa primeiro escreve um arquivo, depois lê o mesmo arquivo de volta.
- Isso significa que você pode executá-lo novamente e novamente e obter o mesmo resultado.
import java.io.*;
import java.util.Scanner;
public class RoundTrip {
public static void main(String[] args) throws IOException {
PrintWriter writer = new PrintWriter("data.txt");
writer.println(3);
writer.println(4);
writer.close();
Scanner in = new Scanner(new File("data.txt"));
int total = 0;
while (in.hasNextInt()) {
total = total + in.nextInt();
}
in.close();
System.out.println(total); // 7
}
}
Common mistakes
nextInt()leaves the newline, so a followingnextLine()reads an empty line.- Check
hasNext()before reading to avoid running off the end.
Erros comuns
nextInt()deixa a nova linha, então umnextLine()subsequente lê uma linha vazia.- Verifique
hasNext()antes de ler para evitar ir além do fim.
Now you try
- Each task pre-fills a class. Write the file first, then read it back, as the prompt asks.
- Remember the
throws IOExceptiononmain, andclose()both the writer and theScanner. - Press Run to compile and run, then Check answer.
Agora você tenta
- Cada tarefa pré-preenche uma classe. Escreva o arquivo primeiro, depois leia-o de volta, conforme solicitado.
- Lembre-se do
throws IOExceptionemmain, eclose()tanto o escritor quanto oScanner. - Pressione Run para compilar e executar, depois Check answer.
First write the numbers 10, 20, 5, 7 to · até data.txt (one per line) with a PrintWriter. Then open it with new Scanner(new File("data.txt")) and use hasNextInt/nextInt to add them up. Print only the total. Expected output: 42. · Primeiro escreva os números 10, 20, 5, 7 em data.txt (um por linha) com um PrintWriter. Depois abra-o com new Scanner(new File("data.txt")) e use hasNextInt/nextInt para somá-los. Imprima apenas o total. Saída esperada: 42.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.
First write the lines apple, banana, cherry to · até words.txt with a PrintWriter. Then open it with a Scanner and use hasNextLine/nextLine to count the lines. Print only the count. Expected output: 3. · Primeiro escreva as linhas apple, banana, cherry em words.txt com um PrintWriter. Depois abra-o com um Scanner e use hasNextLine/nextLine para contar as linhas. Imprima apenas a contagem. Saída esperada: 3.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.