13_O pacote java.io

Propaganda
O pacote java.io
Material baseado na apostila FJ-11: Java e
Orientação a Objetos do curso Caelum,
Ensino e Inovação, disponível para download
em http://www.caelum.com.br/apostilas/
1
Objetivos
•
Ler e escrever bytes, caracteres e Strings de/para a
entrada e saída padrão
•
Ler e escrever bytes, caracteres e Strings de/para
arquivos
•
Utilizar buffers para agilizar a leitura e escrita através de
fluxos
•
Usar Scanner e PrintStream.
2
O pacote java.io
•
Utilizar fluxos de entrada (InputStream) e de saída
(OutputStream) para toda e qualquer operação.
•
•
Classes abstratas InputStream e OutputStream
•
•
•
InputStream: fluxo de entrada, leitura de bytes
OutputStream: fluxo de saída, escrita de bytes.
Algumas especializações de InputStream
•
•
arquivo, conexão via sockets, entrada e saída padrão, etc
AudioInputStream, ByteArrayInputStream, FileInputStream.
Algumas especializações de OutputStream
•
ByteArrayOutputStream, FileOutputStream, PipedOutputStream.
3
Lendo um byte de um arquivo
class TestaEntrada {
public static void main(String[] args)
throws IOException {
InputStream is;
is = new FileInputStream("arquivo.txt");
int b = is.read();
}
}
•
Abre um arquivo no diretório onde o java foi invocado.
4
Byte streams
•
Usadas para fazer entrada e saída de bytes (8 bits).
•
É a forma mais básica de entrada/saída.
•
Não deve ser usada para caracteres.
•
Há também streams para tipos mais elaborados de
dados.
5
Copiando Arquivo byte por byte
class CopiaBytes {
public static void main(String[] args)
throws IOException {
int c;
FileInputStream ent = null;
FileOutputStream sai = null;
try {
ent = new FileInputStream("arquivo.txt");
sai = new FileOutputStream("saida.txt");
}
while ((c = ent.read()) != -1)
sai.write(c);
// Continua no próximo slide
6
Copiando Arquivo byte por byte
// Não esquecer de fechar arquivos abertos
finaly {
if ( ent != null )
ent.close();
if ( sai != null)
sai.close();
}
}
}
7
Character Stream
•
Java armazena caracteres utilizando Unicode
•
Uma Character Stream automaticamente traduz o
formato interno para o formato local (e vice-versa).
•
Nos países ocidentais, normalmente, uma externsão de 8 bits de
ASCII
•
Todas classes Character Stream são especializações de
Reader ou de Writer (classes abstratas).
•
Como com as Byte Streams há várias classes
especiallizadas, por exemplo: FileReader e FileWriter
8
Character Streams e Byte Streams
•
Character Streams são usadas como um complemento
para Bytes Streams
•
Character Streams usam Byte Stream para fazer a
entrada e saída física
•
Character Streams fazem a transformação de bytes em
caracteres (e vice-versa)
9
Lendo um caractere de um arquivo
class TestaEntrada {
public static void main(String[] args)
throws IOException {
InputStream is;
InputStreamReader isr;
is = new FileInputStream("arquivo.txt");
isr = new InputStreamReader(is);
int b = isr.read();
}
}
10
FileReader e FileWriter
class CopiaBytes {
public static void main(String[] args)
throws IOException {
int c;
FileReader ent = null;
FileWriter sai = null;
try {
ent = new FileReader("arquivo.txt");
sai = new FileWriter("saida.txt");
}
while ((c = ent.read()) != -1)
sai.write(c);
// Continua no próximo slide
11
Copiando Arquivo byte por byte
finaly {
if ( ent != null )
ent.close();
if ( sai != null)
sai.close();
}
}
}
12
Entrada e Saída Orientada a linha
•
Caracteres muitas vezes ocorrem em unidades maiores
que caracteres isolados.
•
Uma unidade comum é a linha
•
•
Terminadores de linha
•
•
•
•
Uma string terminada com um caractere de terminação de linha
Carriage-return (“\r”)
Line-feed (“\n”)
Ambos (“\r\n”)
Buffered Streams podem ser usadas para leitura e escrita
orientadas a linha
13
Buffered Streams
•
Acesso ao disco é uma operação demorada
•
Ler e escrever byte a byte ou caracter a caracter é muito pouco
eficiente
•
É comum fazer a leitura e a escrita de grandes porções
de dados
•
Os dados são armazenados temporariamente em áreas
de memória (buffer)
•
•
•
A escrita só é feita quando esta área está cheia ou ao fechar o
arquivo.
A leitura só é feita quanto esta área está vazia.
O buffer é transparente para a aplicação
14
Encadeamento das classes (leitura)
15
Lendo todas as Linha
InputStream is;
InputStreamReader isr;
BufferedReader br;
is = new FileInputStream("arquivo.txt");
isr = new InputStreamReader(is, "ISO-8859-1");
br = new BufferedReader(isr);
String str = br.readLine();
while (str != null) {
System.out.println(str);
str = br.readLine();
}
br.close();
16
Streams Padrão
•
Três streams padrão
•
•
•
System.in
System.out
System.err
Entrada padrão (teclado)
Saída padrão (console)
Saída padrão de erros (console)
•
Estes objetos são definods automaticamente e
não precisam ser abertos
•
System.out e System.err são objetos PrintStream
17
Lendo do teclado
InputStreamReader isr;
BufferedReader br;
isr = new InputStreamReader(System.in);
br = new BufferedReader(isr);
try {
String str = br.readLine();
while (str != null) {
System.out.println(str);
str = br.readLine();
}
br.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
18
Encadeamento das classes (escrita)
19
Escrevendo uma linha no arquivo
OutputStream os;
OutputStreamWriter osw;
BufferedWriter bw;
os = new FileOutputStream("saida.txt");
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
bw.write("escrevendo no arquivo");
bw.newLine();
// muda de linha
bw.close();
•
Atributo opcional boolean em FileOutputStream para append
20
FileReader e FileWriter
String lin;
FileReader entFile = null;
FileWriter saiFile = null;
BufferedReader ent = new BufferedReader(entFile);
PrintWriter sai = new PrintWriter(saiFile);
while ((lin = ent.readLine()) != null) {
System.out.println(lin);
sai.println(lin);
}
entFile.close();
saiFil.close();
21
Scanner e PrintStream
•
A partir do java 1.5
Scanner s;
PrintStream ps;
s = new Scanner(System.in);
try {
ps = new PrintStream("arquivo.txt");
while ( s.hasNextLine() ) {
ps.println( s.nextLine() );
}
ps.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
22
Classe File
•
Não é uma classe Stream
•
É uma representação abstrata de arquivos e diretórios
23
Classe File
File(String pathname)
Construtor.
boolean createNewFile()
Cria um arquivo vazio.
boolean delete()
Remove o arquivo
String getPath()
Obtem o caminho
boolean isDirectory()
Testa se é um diretório
boolean isFile()
Testa se é um arquivo.
String[] list(FilenameFilter filter)
Nomes de arquivos no diretório.
boolean mkdir()
Cria um novo diretório.
24
Listando um diretório
String fileName = args[0];
File fn = new File(fileName);
System.out.println("Nome: " + fn.getName());
if (fn.isDirectory()) {
String content[] = fn.list();
System.out.println("Conteúdo do Diretório:");
for (int i = 0; i < content.length; i++) {
System.out.println(content[i]);
}
25
Download