O documento discute o conceito de streams no Java, que se refere aos dados que fluem de fontes como arquivos, rede e entrada. Streams fornecem os dados de forma unidirecional e sem possibilidade de navegação. A classe File permite gerenciar metadados de arquivos, enquanto streams como FileInputStream e FileOutputStream permitem leitura e escrita de bytes em arquivos. InputStreamReader interpreta os dados como caracteres. O documento fornece exemplos de leitura, escrita e cópia de arquivos usando streams.
Visualization tree multiple linked analytical decisions
Java Streams e arquivos
1. http://publicationslist.org/junio
Java Streams (e arquivo)
Prof. Jose Fernando Rodrigues Junior
http://www.icmc.usp.br/~junio
junio@icmc.usp.br
INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE
COMPUTAÇÃO - USP
SCC0504 - Programação Orientada a
Objetos
2. http://publicationslist.org/junio
• O conceito de streams se refere a uma analogia à água de
um rio, o que seria equivalente aos dados que passam por
um canal de comunicação
• stream (substantivo): pequeno rio, riacho, córrego
(wordreference.com)
• A maior diferença é que a água nos aguarda antes de fluir, e
que a fonte de água não é indeterminada
• O conceito se tornou bastante usado em toda a computação
na década de 90, sendo usado em diversas linguagens de
programação
Introdução
3. http://publicationslist.org/junio
• Streams podem se referir aos dados que fluem de diversas
fontes distintas: arquivos, conexões de rede, entrada padrão
de dados (teclado), ou mesmo a memória
• Streams não podem ser navegadas para frente e para trás, e
também não possuem ponteiros para posição do arquivo
• Para casos assim, usa-se a classe RandomAccessFile, entre
outras
• Streams se baseiam no fluxo unidirecional de bytes, de
characteres, de objetos, entre outras prossibilidades
Introdução
5. http://publicationslist.org/junio
• File é uma classe que permite gerenciar arquivos
• Ela abstrai os metadados de um dado arquivo ou diretório,
como seu caminho, tamanho, e permissões de acesso
Exemplo:
File fonte = new File(“Poo.dat”);
if(fonte.exists( )){
if((!fonte.isHidden()) && (!fonte.isDirectory( ))){
if(fonte.canRead( ) && fonte.canWrite( )){
//caminho considerando o directório corrente
System.out.println(fonte.getPath( ));
//caminho completo que pode ser um soft link (atalho do SO)
System.out.println(fonte.getAbsolutePath( ));
//caminho completo como considerado pelo sistema de arquivos
System.out.println(fonte.getCanonicalPath( ));
System.out.println(fonte.lenght( ));
fonte.delete( );
}
}
}
Classe File
6. http://publicationslist.org/junio
• File é uma classe que permite gerenciar arquivos
• Ela abstrai os metadados de um dado arquivo ou diretório,
como seu caminho, tamanho, e permissões de acesso
Exemplo:
File fonte = new File("c:system");
if(fonte.isDirectory( )){
File[] files = fonte.listFiles();
for(int i = 0; i < files.length; i++)
System.out.println(files[i].getName());
}
fonte.renameTo(new File(“c:system64”));
Classe File
15. http://publicationslist.org/junio
• Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
byte[ ] balde = new byte[64]; /*BUFFER*/
cano.read(balde);
System.out.println("CANO (64 bytes): " + balde);
cano
(FileInputStream)
tanque
(File)
File-FileInputStream
01011001
10110010
10101010
10111100
System.out
(PrintStream)
Como se vê, os streams do Java funcionam segundo
um sistema de pipeline (tubulação) – um mecanismo
fornece os dados para a próxima etapa,
sucessivamente.
30. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader
31. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader
32. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
char[ ] balde = new char[64]; /*BUFFER*/
File-FileInputStream-InputStreamReader
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
balde
(char[64])
33. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
char[ ] balde = new char[64]; /*BUFFER*/
filtro.read(balde);
p r o
g r a
m a c
a o .
File-FileInputStream-InputStreamReader
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
balde
(char[64])
34. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
char[ ] balde = new char[64]; /*BUFFER*/
filtro.read(balde);
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader
balde
(char[64])
p r o
g r a
m a c
a o .
35. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
char[ ] balde = new char[64]; /*BUFFER*/
filtro.read(balde);
System.out.println("CANO (64 chars): " + balde);
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader
System.out
(PrintStream)
36. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
char[ ] balde = new char[64]; /*BUFFER*/
filtro.read(balde);
System.out.println("CANO (64 chars): " + balde);
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader
System.out
(PrintStream)
Os readers do Java interpretam os dados como caracteres e
não como bytes.
Entre eles: BufferedReader, CharArrayReader, FilterReader,
InputStreamReader, PipedReader, StringReader
39. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader-BufferedReader
40. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader-BufferedReader
41. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
BufferedReader decantador = new BufferedReader(filtro);//BUFFER
decantador
(BuffereReader)
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader-BufferedReader
42. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
BufferedReader decantador = new BufferedReader(filtro);//BUFFER
String balde = decantador.readLine();
decantador
(BuffereReader)
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader-BufferedReader
balde
“Estruturas de dados n”
43. http://publicationslist.org/junio
• Leitores específicos fornecem os dados de diferentes
maneiras. Exemplo:
File tanque = new File(“agua.txt”);
FileInputStream cano = new FileInputStream(tanque);
InputStreamReader filtro = new InputStreamReader(cano);
BufferedReader decantador = new BufferedReader(filtro);//BUFFER
String balde = decantador.readLine();
System.out.println(balde);
decantador
(BuffereReader)
filtro
(InputStreamReader )
cano
(FileInputStream)
tanque
(File)
File-FileInputStream-InputStreamReader-BufferedReader
System.out
(PrintStream)
45. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File-FileOutputStream-ObjectOutputStream
46. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
File-FileOutputStream-ObjectOutputStream
tanque
(File)
47. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
File-FileOutputStream-ObjectOutputStream
tanque
(File)
canoOut
(FileOutputStream)
48. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
File-FileOutputStream-ObjectOutputStream
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
49. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
t
c
File-FileOutputStream-ObjectOutputStream
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
50. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
t
c
File-FileOutputStream-ObjectOutputStream
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
• Atenção: qualquer classe escrita em Java pode ser
serializada, para isso ela tem que implementar a Interface
Serializable.
• A Interface Serializable é uma “tagging interface”, ela não
possui nenhum método e nenhum atributo. Ela apenas tipifica
uma dada classe indicando que ela pode ser escrita como uma
sequência de bytes.
51. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
t
c
File-FileOutputStream-ObjectOutputStream
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
52. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
t
tanque
(File)
File-FileOutputStream-ObjectOutputStream
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
53. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
tanque
(File)
File-FileOutputStream-ObjectOutputStream
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
54. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
FileInputStream canoIn = new FileInputStream(tanque);
File-FileInputStream-ObjectInputStream
tanque
(File)
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream ) canoIn
(FileInputStream)
55. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
FileInputStream canoIn = new FileInputStream(tanque);
ObjectInputStream deserializador = new ObjectInputStream(canoIn);
tanque
(File)
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
deserializador
(ObjectInputStream )
canoIn
(FileInputStream)
File-FileInputStream-ObjectInputStream
56. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
FileInputStream canoIn = new FileInputStream(tanque);
ObjectInputStream deserializador = new ObjectInputStream(canoIn);
c = (Circulo) deserializador.readObject();
tanque
(File)
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
deserializador
(ObjectInputStream )
canoIn
(FileInputStream)
c
File-FileInputStream-ObjectInputStream
57. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
FileInputStream canoIn = new FileInputStream(tanque);
ObjectInputStream deserializador = new ObjectInputStream(canoIn);
c = (Circulo) deserializador.readObject();
t = (Triangulo) deserializador.readObject();
tanque
(File)
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
deserializador
(ObjectInputStream )
canoIn
(FileInputStream)
t
c
File-FileInputStream-ObjectInputStream
58. http://publicationslist.org/junio
• Também é possível fazer stream com instâncias de objetos,
lendo e escrevendo objetos inteiros em arquivo
serialização. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
ObjectOutputStream serializador = new ObjectOutputStream(canoOut);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
FileInputStream canoIn = new FileInputStream(tanque);
ObjectInputStream deserializador = new ObjectInputStream(canoIn);
c = (Circulo) deserializador.readObject();
t = (Triangulo) deserializador.readObject();
tanque
(File)
tanque
(File)
canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
deserializador
(ObjectInputStream )
canoIn
(FileInputStream)
t
c
File-FileInputStream-ObjectInputStream
61. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
tanque
(File)
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream
62. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream
tanque
(File)canoOut
(FileOutputStream)
63. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
GZIPOutputStream compactador = new GZIPOutputStream(canoOut);
tanque
(File)canoOut
(FileOutputStream)
compactador
(GZIPOutputStream)
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream
64. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
GZIPOutputStream compactador = new GZIPOutputStream(canoOut);
ObjectOutputStream serializador = new ObjectOutputStream(compactador);
tanque
(File)canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
compactador
(GZIPOutputStream)
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream
65. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
GZIPOutputStream compactador = new GZIPOutputStream(canoOut);
ObjectOutputStream serializador = new ObjectOutputStream(compactador);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
t
c
tanque
(File)canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
compactador
(GZIPOutputStream)
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream
66. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
GZIPOutputStream compactador = new GZIPOutputStream(canoOut);
ObjectOutputStream serializador = new ObjectOutputStream(compactador);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
t
c
tanque
(File)canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
compactador
(GZIPOutputStream)
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream
67. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
GZIPOutputStream compactador = new GZIPOutputStream(canoOut);
ObjectOutputStream serializador = new ObjectOutputStream(compactador);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
t canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
compactador
(GZIPOutputStream)
tanque
(File)
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream
68. http://publicationslist.org/junio
• Pode-se também usar compactação. Exemplo:
File tanque = new File(“POO.dat”);
tanque.createNewFile();
FileOutputStream canoOut = new FileOutputStream(tanque);
GZIPOutputStream compactador = new GZIPOutputStream(canoOut);
ObjectOutputStream serializador = new ObjectOutputStream(compactador);
Circulo c = new Circulo(232.43f, 432.15f, "Um circulo");
Triangulo t = new Triangulo(543, 67, 215, "Um triangulo");
serializador.writeObject(c);
serializador.writeObject(t);
Exercício: escreva o código e ilustre a leitura dos objetos que
foram compactados em arquivo.
tanque
(File)canoOut
(FileOutputStream)
serializador
(ObjectOutputStream )
compactador
(GZIPOutputStream)
File-FileOutputStream-GZIPOutputStream-ObjectOutputStream