Até agora, sempre que precisámos de obter alguma informação externa para o nosso programa, fizemo-lo através do System.in
, que é um atributo static público da classe System
, que é do tipo java.io.InputStream
.
Um objeto do tipo InputStream
fornece-nos um canal através do qual bytes de informação podem ser "lidos para dentro" do nosso programa.
Para podermos trabalhar estes bytes de informação de forma mais fácil, usamos um objeto do tipo Scanner
, que converte sequências de bytes lidos do InputStream
em valores de tipos vários (relembrar secção 8.5 neste livro).
A classe Scanner
fornece vários construtores, entre os quais:
Scanner(File source)
Scanner(InputStream source)
Já vimos como usar o segundo.
Para criarmos um scanner que nos ajude a ler o conteúdo de um ficheiro de texto qualquer, podemos usar o primeiro construtor da lista acima:
xxxxxxxxxx
Scanner reader = new Scanner(new File("myInput.txt"));
Esta instrução cria um canal de leitura para o ficheiro myInput.txt
. Depois é só usar os métodos da classe Scanner
para ter acesso aos vários tokens nesse ficheiro.
Não é possível prever em tempo de compilação a existência de um ficheiro com o nome myInput.txt
. Por essa razão, o método que contém aquela instrução pode lançar uma exceção em tempo de execução. Para já, não vamos ver como se trataria essa exceção (ver capítulo ??); vamos apenas avisar que tal exceção pode ocorrer, colocando na assinatura do método a expressão throws FileNotFoundException
.
xpublic static void main(String[] args) throws FileNotFoundException {
// abrir um canal de leitura
Scanner leitor = new Scanner(new File("myInput.txt"));
// enquanto existem linhas por ler no ficheiro
while (leitor.hasNextLine()){
String linha = leitor.nextLine();
if(linha.contains("x")){
System.out.println(linha);
}
}
leitor.close();
}
Se o conteúdo do ficheiro myInput.txt
for:
xxxxxxxxxx
Pontos
Pontuacao
Caixa
Tacha
Taxa
então o output do main
será:
xxxxxxxxxx
Caixa
Taxa
Até agora, sempre que precisámos de fazer sair alguma informação para o exterior do nosso programa, de modo a que o utilizador a possa ver, fizemo-lo através do System.out
, que é outro atributo static público da classe System
, mas do tipo java.io.PrintStream
.
Uma outra classe da biblioteca do Java, no pacote java.io
, é a classe PrintStream
que fornece métodos print
e println
para escrever valores dos vários tipos primitivos e do tipo String
, e o método write
para escrever uma String
ou um único caráter, dado um inteiro representando o seu código.
O seguinte método lê o conteúdo de um ficheiro cujo nome é dado pelo parâmetro fileIn
, linha a linha, e escreve as linhas invertidas num ficheiro cujo nome é dado pelo parâmetro fileOut
.
xxxxxxxxxx
public static void inverteLinhas (String fileIn,
String fileOut) throws IOException {
Scanner in = new Scanner (new File(fileIn));
PrintWriter out = new PrintWriter(fileOut);
while (in.hasNextLine()) {
String line = in.nextLine();
StringBuilder sb = new StringBuilder(line);
out.write(sb.reverse().toString() + "\n");
}
in.close();
out.close();
}
Se o conteúdo do ficheiro myInput.txt
for:
xxxxxxxxxx
Eles não sabem que o sonho
é uma constante da vida
tão concreta e definida
como outra coisa qualquer
então a execução da seguinte instrução:
xxxxxxxxxx
inverteLinhas("myInput.txt", "myOutput.txt");
criará um ficheiro de nome myOutput.txt
(se não existir ainda) e escreverá nesse ficheiro o seguinte conteúdo:
xxxxxxxxxx
ohnos o euq mebas oãn selE
adiv ad etnatsnoc amu é
adinifed e atercnoc oãt
reuqlauq asioc artuo omoc
Anterior: 8.8. Garbagge collection
Seguinte: 8.10. Exceções