0% acharam este documento útil (0 voto)
10 visualizações91 páginas

Manipulação de Arquivos em Java

O documento aborda a organização e manipulação de arquivos em Java, destacando a importância dos dados persistentes armazenados em dispositivos de armazenamento secundário. Ele descreve como os registros são organizados em arquivos e como a linguagem Java trata arquivos como fluxos de bytes, além de apresentar classes como File e métodos para manipulação de arquivos. Exemplos de código são fornecidos para ilustrar a criação e leitura de arquivos texto de acesso sequencial.

Enviado por

piedad5123
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
10 visualizações91 páginas

Manipulação de Arquivos em Java

O documento aborda a organização e manipulação de arquivos em Java, destacando a importância dos dados persistentes armazenados em dispositivos de armazenamento secundário. Ele descreve como os registros são organizados em arquivos e como a linguagem Java trata arquivos como fluxos de bytes, além de apresentar classes como File e métodos para manipulação de arquivos. Exemplos de código são fornecidos para ilustrar a criação e leitura de arquivos texto de acesso sequencial.

Enviado por

piedad5123
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Arquivos

I Nos referimos aos dados armazenados em arquivos como


dados persistentes

I Existem além da execução do programa;

I Armazenados em dispositivos de armazenamento secundário

I Discos rı́gidos, discos ópticos, fitas magnéticas, etc.

1/92
Arquivos (cont.)

I Itens de dados processados por computadores formam uma


hierarquia de dados

I Tipicamente, vários campos formam um registro (uma classe


em Java, por exemplo);

I Um arquivo é um grupo de registros relacionados;

I Para recuperarmos registros especı́ficos de um arquivo, pelo


menos um campo é escolhido como chave do registro

2/92
Arquivos (cont.)

3/92
Arquivos (cont.)

I Existem diversas maneiras de organizar registros em um


arquivo

I O mais comum é o arquivo sequencial

I Armazena os registros em ordem de acordo com a chave do


registro

I Frequentemente, um grupo de arquivos relacionados é


chamado de base de dados

I Controlados por um sistema gerenciador de bases de dados


(SGBD)

4/92
Arquivos (cont.)

I A linguagem Java trata arquivos como fluxos de bytes


sequenciais

I O sistema operacional avisa quando o final do fluxo chegou

I Em outros casos a indicação de final de arquivo é


representada por uma exceção

I Ainda, o final de arquivo pode ser indicado por um valor de


retorno de um método que processe o fluxo de bytes

5/92
Arquivos (cont.)

I Arquivos texto são criados utilizando–se fluxos baseados


em caracteres

I Dados são armazenados como uma sequência de caracteres


Unicode

I Arquivos binários são criados utilizando-se fluxos baseados


em bytes

I Dados são armazenados em formato binário

6/92
Arquivos (cont.)

I Um programa Java abre um arquivo através da criação de


um objeto e da associação de um fluxo de bytes ou
caractere a ele

I FileInputStream: para leitura de arquivos binários;

I FileOutputStream: para escrita de arquivos binários;

I FileReader: para leitura em arquivos texto;

I FileWriter: para escrita em arquivos texto.

I Além destas classes do pacote [Link], também podemos


utilizar as classes Scanner e Formatter

7/92
Classe File

I A classe File é particularmente útil para recuperar


informações sobre arquivos e diretórios do sistema de
arquivos

I Não abrem arquivos ou fornecem processamento de


arquivos;

I São utilizados em conjunto com objetos de outras classes


[Link] para auxiliar a manipulação de arquivos.

8/92
Classe File (cont.)

I A classe possui 4 construtores

I Localizam arquivos ou diretórios utilizando caminho relativo ou


absoluto, ou ainda, um endereço web

I A tabela a seguir sumariza os métodos da classe File

9/92
Classe File (cont.)

10/92
Classe File (cont.)

11/92
[Link]
import java . io . F i l e ;
import java . u t i l . Scanner ;
public class FileDemonstration {
public s t a t i c void analyzePath ( S t r i n g path ) {
F i l e name = new F i l e ( p a t h ) ;
i f ( name . e x i s t s ( ) ) {
System . o u t . p r i n t f ( " %s %s\n %s\n %s\n %s\n %s %s\n
%s %s\n %s %s\n %s %s\n %s %s" ,
name . getName ( ) , " exists " ,
( name . i s F i l e ( ) ? " is a file "
: " is not a file " ) ,
( name . i s D i r e c t o r y ( ) ? " is a directory "
: " is not a directory " ) ,
( name . i s A b s o l u t e ( ) ? " is absolute path "
: " is not absolute path " ) ,
" Last modified : " , name . l a s t M o d i f i e d ( ) ,
" Length : " , name . l e n g t h ( ) ,
" Path : " , name . g e t P a t h ( ) ,
" Absolute path : " , name . g e t A b s o l u t e P a t h ( ) ,
" Parent : " , name . g e t P a r e n t ( ) ) ;
12/92
[Link] (cont.)

// exibe a listagem do diretorio


i f ( name . i s D i r e c t o r y ( ) ) {
S t r i n g d i r e c t o r y [ ] = name . l i s t ( ) ;
System . o u t . p r i n t l n ( "\n\ nDirectory
contents :\ n" ) ;
f o r ( String directoryName : d i r e c t o r y )
System . o u t . p r i n t f ( " %s\n" ,
directoryName ) ;
}
}
e l s e // se nao existir arquivo ou diretorio, exibe a mensagem de
erro
{
System . o u t . p r i n t f ( " %s %s" , path , " does not
exist ." ) ;
}
}

13/92
[Link] (cont.)

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
S c a n n e r i n p u t = new S c a n n e r ( System . i n ) ;
System . o u t . p r i n t ( " Enter file or directory name
: " );
analyzePath ( input . nextLine () ) ;
}

14/92
[Link] (cont.)

E n t e r f i l e o r d i r e c t o r y name h e r e : C : \ Program F i l e s \
Java
\ j d k 1 . 6 . 0 \ demo\ j f c
jfc exists
i s not a f i l e
is a directory
i s a b s o l u t e path
L a s t m o d i f i e d : 1162570370359
Length : 0
Path : C : \ Program F i l e s \ J a v a \ j d k 1 . 6 . 0 \ demo\ j f c
A b s o l u t e p a t h : C : \ Program F i l e s \ J a v a \ j d k 1 . 6 . 0 \ demo\ j f c
P a r e n t : C : \ Program F i l e s \ J a v a \ j d k 1 . 6 . 0 \ demo
Directory contents :
CodePointIM
FileChooserDemo
Font2DTest

15/92
[Link] (cont.)

E n t e r f i l e o r d i r e c t o r y name : C : \ Program F i l e s \ J a v a \
j d k 1 . 6 . 0 1 1 \demo\ j f c \ Java2D \README. t x t
README. t x t e x i s t s
is a file
i s not a d i r e c t o r y
i s a b s o l u t e path
L a s t m o d i f i e d : 1228404384270
L e n g t h : 7518
Path : E : \ Program F i l e s \ J a v a \ j d k 1 . 6 . 0 1 1 \demo\ j f c \ Java2D
\README. t x t
A b s o l u t e p a t h : E : \ Program F i l e s \ J a v a \ j d k 1 . 6 . 0 1 1 \demo\
j f c \ Java2D \README. t x t
P a r e n t : E : \ Program F i l e s \ J a v a \ j d k 1 . 6 . 0 1 1 \demo\ j f c \
Java2D

16/92
Arquivos de Texto de Acesso Sequencial

I A classe descrita a seguir encapsula as informações sobre


clientes de um banco

I Número da conta, nome e sobrenome e saldo;

I Com respectivos getters e setters;

I Estas informações formam o registro de cada cliente

17/92
[Link]

public class AccountRecord {


private i n t account ;
private String firstName ;
private S t r i n g lastName ;
private double balance ;

p u b l i c AccountRecord ( ) {
t h i s ( 0 , "" , "" , 0 . 0 ) ;
}

p u b l i c AccountRecord ( i n t account , S t r i n g firstName ,


S t r i n g lastName , d o u b l e b a l a n c e ) {
setAccount ( account ) ;
setFirstName ( firstName ) ;
setLastName ( lastName ) ;
setBalance ( balance ) ;
}

18/92
[Link] (cont.)
p u b l i c i n t getAccount () {
r e t u r n account ;
}

p u b l i c void setAccount ( i n t account ) {


t h i s . account = account ;
}

p u b l i c String getFirstName () {
return firstName ;
}

public void setFirstName ( String firstName ) {


t h i s . firstName = firstName ;
}

p u b l i c S t r i n g getLastName ( ) {
r e t u r n lastName ;
}
19/92
[Link] (cont.)

p u b l i c v o i d setLastName ( S t r i n g lastName ) {
t h i s . lastName = lastName ;
}

p ub l ic double getBalance () {
return balance ;
}

p ub l ic void setBalance ( double balance ) {


t h i s . balance = balance ;
}
}

20/92
Arquivos Texto de Acesso Sequencial

I O programa a seguir cria um arquivo texto de acesso


sequencial simples

I Os dados sobre o cliente do banco são obtidos e inseridos no


arquivo.

21/92
[Link]
import java . io . FileNotFoundException ;
import java . u t i l . Formatter ;
import java . u t i l . FormatterClosedException ;
import java . u t i l . NoSuchElementException ;
import java . u t i l . Scanner ;

public class CreateTextFile {


p r i v a t e F o r m a t t e r o u t p u t ; // objeto utilizado para gerar saı́da
de texto no arquivo
public void openFile () {
t r y { // append
//output = new Formatter(FileWriter(ç[Link]”,true));
o u t p u t = new F o r m a t t e r ( " clients . txt " ) ;
}
catch ( SecurityException e ){
System . e r r . p r i n t l n ( " You do not have write
access to this file " ) ;
System . e x i t ( 1 ) ; // termina o programa
}
22/92
[Link] (cont.)
catch ( FileNotFoundException e ){
System . e r r . p r i n t l n ( " Error creating file " ) ;
System . e x i t ( 1 ) ; // termina o programa
}
}
// adiciona registros ao arquivo
p u b l i c void addRecords () {
A c c o u n t R e c o r d r e c o r d = new A c c o u n t R e c o r d ( ) ;
S c a n n e r i n p u t = new S c a n n e r ( System . i n ) ;
System . o u t . p r i n t f ( " %s\n %s\n %s\n %s\n\n" ,
" To terminate input , type the end -of - file
indicator " ,
" when you are prompted to enter input " ,
" On UNIX / Linux / Mac OS X type <ctrl > d then
press Enter " ,
" On Windows type <ctrl > z then press Enter " ) ;

System . o u t . p r i n t f ( " %s\n %s" ,


" Enter account number (> 0) , first name ,
last name and balance ." , "? " ) ;
23/92
[Link] (cont.)
// faz um loop até o indicador de fim de arquivo
w h i l e ( i n p u t . hasNext ( ) ) {
t r y { // gera saı́da dos valores para o arquivo
record . setAccount ( input . nextInt () ) ;
record . setFirstName ( input . next () ) ;
r e c o r d . setLastName ( i n p u t . next ( ) ) ;
record . setBalance ( input . nextDouble () ) ;

i f ( r e c o r d . getAccount ( ) > 0) {
//grave um novo registro
o u t p u t . f o r m a t ( " %d %s %s %.2f\n" ,
record . getAccount () ,
record . getFirstName () ,
r e c o r d . getLastName ( ) ,
record . getBalance () ) ;
}
else{
System . o u t . p r i n t l n ( " Account number
must be greater than 0" ) ;
}
} 24/92
[Link] (cont.)

catch ( FormatterClosedException e ){
System . e r r . p r i n t l n ( " Error writing to
file " ) ;
return ;
}
catch ( NoSuchElementException e ) {
System . e r r . p r i n t l n ( " Invalid input .
Please try again ." ) ;
i n p u t . n e x t L i n e ( ) ; // descarta a entrada para que
o usuário possa tentar novamente
}

25/92
[Link] (cont.)

System . o u t . p r i n t f ( " %s\n %s" ,


" Enter account number (> 0) , first name ,
last name and balance ." , "? " ) ;
}
}

public void c l o s e F i l e () {
i f ( o u t p u t != n u l l ) {
output . c l o s e () ;
}
}
}

26/92
Arquivos Texto de Acesso Sequencial

I Um objeto Formatter é utilizado para gravar os dados no


arquivo

I Caso o caminho até o arquivo não seja fornecido, é assumido


que o arquivo esteja na mesma pasta em que o programa está;
I Se o arquivo não existir, será criado

I Se não puder ser criado, a exceção FileNotFoundException é


lançada.

I Se um arquivo existente for aberto, ele será truncado!

I Todo o conteúdo é descartado.

27/92
Arquivos Texto de Acesso Sequencial (cont.)

I Caso não seja permitido escrever o no arquivo, a exceção


SecurityException é lançada;

I O método format escreve no arquivo

I Com uma formatação semelhante ao [Link]

I O método close fecha o arquivo

I Se o arquivo não for fechado explicitamente, o sistema


operacional o fechará.

28/92
[Link]

public class CreateTextFileTest {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
C r e a t e T e x t F i l e app = new C r e a t e T e x t F i l e ( ) ;

app . o p e n F i l e ( ) ;
app . a d d R e c o r d s ( ) ;
app . c l o s e F i l e ( ) ;
}
}

29/92
[Link] (cont.)
To t e r m i n a t e i n p u t , t y p e t h e end−o f − f i l e i n d i c a t o r
when you a r e prompted t o e n t e r i n p u t .
On UNIX/ L i n u x /Mac OS X t y p e < c t r l > d t h e n p r e s s E n t e r
On Windows t y p e < c t r l > z t h e n p r e s s E n t e r
E n t e r a c c o u n t number (> 0 ) , f i r s t name , l a s t name and
balance .
? 100 Bob J o n e s 2 4 . 9 8
E n t e r a c c o u n t number (> 0 ) , f i r s t name , l a s t name and
balance .
? 200 S t e v e Doe −345.67
E n t e r a c c o u n t number (> 0 ) , f i r s t name , l a s t name and
balance .
? 300 Pam White 0 . 0 0
E n t e r a c c o u n t number (> 0 ) , f i r s t name , l a s t name and
balance .
? 400 Sam S t o n e −42.16
E n t e r a c c o u n t number (> 0 ) , f i r s t name , l a s t name and
balance .
? 500 Sue R i c h 2 2 4 . 6 2
E n t e r a c c o u n t number (> 0 ) , f i r s t name , l a s t name and
balance .
? ˆZ

30/92
Leitura de Arquivos de Texto de Acesso Sequencial

I No exemplo a seguir, o arquivo texto de acesso sequencial


criado no exemplo anterior será lido

I A classe Scanner pode ser utilizada para ler do arquivo, assim


como lê do teclado

31/92
[Link]

import java . io . File ;


import java . io . FileNotFoundException ;
import java . u t i l . NoSuchElementException ;
import java . u t i l . Scanner ;

public c l a s s ReadTextFile {
p r i v a t e Scanner input ;

// permite ao usuário abrir o arquivo


public void openFile () {
try {
i n p u t=new S c a n n e r ( new F i l e ( " clients . txt " ) ) ;
}
catch ( FileNotFoundException e ){
System . e r r . p r i n t l n ( " Error opening file " ) ;
System . e x i t ( 1 ) ;
}
}

32/92
[Link] (cont.)
// lê o registro no arquivo
public void readRecords () {
A c c o u n t R e c o r d r e c o r d = new A c c o u n t R e c o r d ( ) ;
System . o u t . p r i n t f ( " %-10s %-12s %-12s %10s\n" ,
" Account " , " First Name " , " Last Name " , " Balance " ) ;
try {
w h i l e ( i n p u t . hasNext ( ) ) {
record . setAccount ( input . nextInt () ) ;
record . setFirstName ( input . next () ) ;
r e c o r d . setLastName ( i n p u t . next ( ) ) ;
record . setBalance ( input . nextDouble () ) ;
// exibe o conteúdo de registro
System . o u t . p r i n t f ( " %-10d %-12s %-12s
%10.2 f\n" , r e c o r d . g e t A c c o u n t ( ) ,
record . getFirstName () ,
r e c o r d . getLastName ( ) ,
record . getBalance () ) ;
}
}
33/92
[Link] (cont.)
//Se as informações no arquivo não estiverem adequadamente
formatadas
catch ( NoSuchElementException e ) {
System . e r r . p r i n t l n ( " File improperly formed "
);
input . close () ;
System . e x i t ( 1 ) ;
}
//Se Scanner foi fechado antes de os dados serem inseridos
catch ( I l l e g a l S t a t e E x c e p t i o n e ){
System . e r r . p r i n t l n ( " Error reading from file
") ;
System . e x i t ( 1 ) ;
}
}
public void c l o s e F i l e () {
i f ( i n p u t != n u l l )
input . close () ;
}
}
34/92
Arquivos Texto de Acesso Sequencial

I No construtor do objeto Scanner, enviamos um objeto File


como argumento

I Especifica que o objeto Scanner lerá a partir do arquivo


[Link], no mesmo diretório do programa.

I Para lermos, utilizamos os métodos nextInt, next e


nextDouble

I Se o dado lido é incorreto, a exceção


NoSuchElementException é lançada

I O método hasNext é utilizado para determinar o final do


arquivo

35/92
Arquivos Texto de Acesso Sequencial (cont.)

I Se o objeto Scanner é fechado antes da leitura, a exceção


IllegalStateException é lançada

I Para fecharmos o Scanner utilizamos o método close

36/92
[Link]

public c l a s s ReadTextFileTest {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
R e a d T e x t F i l e a p p l i c a t i o n = new R e a d T e x t F i l e ( ) ;
application . openFile () ;
a p p l i c a t i o n . readRecords () ;
application . c l o s e F i l e () ;
}

37/92
Saı́da

Account F i r s t Name L a s t Name Balance


100 Bob Jones 24.98
200 Steve Doe −345.67
300 Pam White 0.00
400 Sam Stone −42.16
500 Sue Rich 224.62

38/92
Arquivos Texto de Acesso Sequencial

I Registros em arquivos de acesso sequencial normalmente não


são atualizados em um local especı́fico

I O tamanho dos campos dos registros pode ser variável, o que


corromperia o arquivo original

I Por segurança, é necessário reescrever todo o conteúdo do


arquivo

39/92
Serialização de Objetos

I Frequentemente, não sabemos exatamente como os dados


estão armazenados em um arquivo

I Nestes casos, é útil ler/escrever um objeto inteiro em um


arquivo

I Java fornece tal mecanismo, chamado de serialização de


objetos

40/92
Serialização de Objetos (cont.)

I Um objeto serializável é um objeto representado como uma


sequência de bytes que incluem os dados do objeto

I Bem como informação sobre o tipo do objeto e dos dados


contidos nele

I Uma vez escrito em um arquivo, o objeto pode ser lido e


deserializado

I Ou seja, recriado na memória

41/92
Serialização de Objetos (cont.)

I As classes ObjectInputStream e ObjectOutputStream


permitem que objetos inteiros sejam lidos a partir ou escritos
em um fluxo

I Para utilizar a serialização com arquivos inicializamos objetos


destas classes com objetos de fluxos relacionados a arquivos;

I FileInputStream para leitura;

I FileOutPutStream para escrita

42/92
Serialização de Objetos (cont.)

I O método writeObject recebe como argumento um Object


que implemente a interface Serializable e o escreve em um
OutputStream

I Correspondentemente, o método readObject lê e retorna uma


referência a um Object a partir de um InputStream

I Depois de lido, pode ser feito um cast para o tipo adequado do


objeto.

I A serialização de objetos é realizada com fluxos baseados em


bytes

I Logo, os arquivos são binários

43/92
Serialização de Objetos (cont.)

I O exemplo a seguir demonstra a criação e escrita de um


arquivo de acesso sequencial

I Para escrevermos os objetos da classe AccountRecord,


precisamos alterar nossa classe

I Os objetos precisam ser serializáveis.

44/92
Serialização de Objetos (cont.)

I A interface Serializable precisa ser implementada

I É uma tagging interface, não possui métodos;

I Simplesmente “marca” uma classe como serializável;

I Qualquer atributo que não seja serializável deve ser declarado


como transient

I Tipos primitivos e vetores são serializáveis por padrão

45/92
Serialização de Objetos (cont.)

I Desta forma, criamos a classe AccountRecordSerializable a


partir da classe AccountRecord, alterando apenas o cabeçalho
da classe:
p u b l i c c l a s s A c c o u n t R e c o r d S e r i a l i z a b l e implements
Serializable

I Todos os atributos e métodos são mantidos como na classe


original

I Objetos desta classe serão escritos no exemplo a seguir

46/92
[Link]
import java . io . FileOutputStream ;
import java . io . IOException ;
import j a v a . i o . ObjectOutputStream ;
import j a v a . u t i l . NoSuchElementException ;
import java . u t i l . Scanner ;
public class CreateSequentialFile
{
//escreve os dados no arquivo
p r i v a t e ObjectOutputStream output ;
// permite que o nome do arquivo seja especificado
public void openFile () {
try {
o u t p u t = new O b j e c t O u t p u t S t r e a m ( new
F i l e O u t p u t S t r e a m ( " clients . ser " ) ) ;
}
catch ( IOException ioException ){
System . e r r . p r i n t l n ( " Error opening file ." ) ;
}
}
47/92
[Link] (cont.)
// adiciona os registros ao arquivo
p u b l i c void addRecords () {
// objeto a ser escrito no arquivo
AccountRecordSerializable record ;
i n t accountNumber = 0 ; // campo numero da conta
S t r i n g f i r s t N a m e ; // campo nome para o objeto
S t r i n g l a s t N a m e ; // campo sobrenome para o objeto
d o u b l e b a l a n c e ; // campo saldo para o objeto
S c a n n e r i n p u t = new S c a n n e r ( System . i n ) ;
System . o u t . p r i n t f ( " %s\n %s" , " Enter account number
(> 0) , first name , last
name and balance ." , "? " ) ;
// repete ate o indicador de final de arquivo
w h i l e ( i n p u t . hasNext ( ) ) {
try {
accountNumber = i n p u t . n e x t I n t ( ) ;
f i r s t N a m e = i n p u t . n e x t ( ) ; // le o nome
l a s t N a m e = i n p u t . n e x t ( ) ; // le o sobrenome
b a l a n c e = i n p u t . n e x t D o u b l e ( ) ; // le o sal
48/92
[Link] (cont.)

i f ( accountNumber > 0 ) {
// cria um novo registro
r e c o r d = new A c c o u n t R e c o r d S e r i a l i z a b l e (
accountNumber , f i r s t N a m e , lastName ,
balance ) ;
// escreve o objeto no arquivo
output . writeObject ( record ) ;
}
else {
System . o u t . p r i n t l n ( " Account number must be
greater than 0. " ) ;
}
}
catch ( IOException ioException ) {
System . e r r . p r i n t l n ( " Error writing to file ." ) ;
return ;
}

49/92
[Link] (cont.)

catch ( NoSuchElementException elementException ) {


System . e r r . p r i n t l n ( " Invalid input . Please try
again ." ) ;
input . nextLine () ;
}
System . o u t . p r i n t f ( " %s %s\n %s" , " Enter account
number ( >0) ," , " first name , last name and
balance ." , "? " ) ;
}
}

50/92
[Link] (cont.)

public void c l o s e F i l e () {
try {
i f ( o u t p u t != n u l l )
output . c l o s e () ;
}
catch ( IOException ioException ) {
System . e r r . p r i n t l n ( " Error closing file ." ) ;
System . e x i t ( 1 ) ;
}
}
}

51/92
Serialização de Objetos

I O arquivo é aberto na criação de um objeto


FileOutputStream

I A string passada para o construtor indica o caminho e o nome


do arquivo

I Uma versão sobrecarregada recebe um argumento booleano


adicional indicado se o conteúdo deve ser adicionado ao final
do arquivo.

I A mesma polı́tica de criação/truncamento de arquivos texto é


utilizada para arquivos binários;

52/92
Serialização de Objetos (cont.)

I Esta classe não fornece métodos para escrevermos objetos


para arquivos

I Por isto, “embrulhamos” FileOutputStream em


ObjectOutputStream

I Esta última possui o método writeObject,que escreve um


objeto serializável inteiro em um OutputStream

I O método close fecha o arquivo

53/92
Leitura: Serialização de Objetos

I O exemplo a seguir lê o arquivo criado no exemplo anterior

I Um objeto FileInputStream “embrulha” um objeto


ObjectInputStream, abrindo o arquivo binário para leitura

I O método readObject da classe ObjectInputStream é


utilizado para ler do arquivo e armazenar em um objeto
AccountRecordSerializable

I O valor é retornado como um Object;

I É necessário realizar um cast para a classe adequada na


atribuição.

54/92
Leitura: Serialização de Objetos (cont.)

I Caso o programa tente ler além do final do arquivo, a exceção


EOFException é lançada;

I Se a classe do objeto lido não for encontrada, a exceção


ClassNotFoundException é lançada

55/92
[Link]

import java . io . EOFException ;


import java . io . FileInputStream ;
import java . io . IOException ;
import java . io . ObjectInputStream ;

public class ReadSequentialFile {


p r i v a t e ObjectInputStream input ;
//abre o arquivo
public void openFile () {
try {
i n p u t = new O b j e c t I n p u t S t r e a m ( new F i l e I n p u t S t r e a m
( " clients . ser " ) ) ;
}
catch ( IOException ioException ){
System . e r r . p r i n t l n ( " Error opening file ." ) ;
}
}

56/92
[Link] (cont.)

// Lê o registro de um arquivo


public void readRecords () {
AccountRecordSerializable record ;
System . o u t . p r i n t f ( " %-10s %-12s %-12s %10s\n" , " Account
" , " First Name " , " Last Name " , " Balance " ) ;
try {
while ( true ){
record = ( AccountRecordSerializable ) input .
readObject () ;
// exibe o conteudo do arquivo
System . o u t . p r i n t f ( " %-10d %-12s %-12s %10.2 f\n" ,
record . getAccount () ,
record . getFirstName () ,
r e c o r d . getLastName ( ) ,
record . getBalance () ) ;
}
}

57/92
[Link] (cont.)

//se ocorrer uma tentativa de leitura depois do fim do arquivo


c a t c h ( EOFException e n d O f F i l e E x c e p t i o n ) {
return ;
}
//se o arquivo acessado não tiver a classe
catch ( ClassNotFoundException e ){
System . e r r . p r i n t l n ( " Unable to create object ." ) ;
}
catch ( IOException e ) {
System . e r r . p r i n t l n ( " Error during reading from
file ." ) ;
}
}

58/92
[Link] (cont.)

// fecha o arquivo e termina a aplicacao


public void c l o s e F i l e () {
try {
i f ( i n p u t != n u l l )
input . close () ;
}
catch ( IOException ioException ) {
System . e r r . p r i n t l n ( " Error closing file ." ) ;
System . e x i t ( 1 ) ;
}
}
}

59/92
Arquivos de Acesso Aleatório

I Arquivos de acesso aleatório podem ser lidos ou escritos em


posições arbitrárias

I Determinadas pelo número do registro, ou simplesmente ao


final do arquivo;

I Atualizáveis.

I A classe RandomAccessFile fornece facilidades para criação


de tais arquivos

I Trata os arquivos como um vetor de bytes armazenados no


sistema de arquivos;

60/92
Arquivos de Acesso Aleatório (cont.)

I Há um tipo de “cursor” (file pointer), que pode ser


posicionado onde necessário;

I Métodos getFilePointer (retorna a posição) e seek (define


uma nova posição);

I Além de métodos para escrita/leitura

61/92
Arquivos de Acesso Aleatório (cont.)

I O construtor recebe como argumentos o objeto File, e o modo


de abertura

I “r”: leitura;

I “rw”: leitura e escrita;

I “rws”: leitura e escrita e metadados sincronizados com o


dispositivo de armazenamento;

I “rwd”: leitura e escrita sincronizados com o dispositivo de


armazenamento
RandomAccessFile r a f = RandomAccessFile ( f i l e , "
rw " )

62/92
Arquivos de Acesso Aleatório (cont.)

I Para a leitura do arquivo, existem diversos métodos

I read, readByte, readFloat, readInt, readLine, readShort,


readLong . . .

I Analogamente, para escrita no arquivo, há métodos


correspondentes

I write, writeByte, writeFloat, writeInt, writeLine, writeShort,


writeLong . . .

63/92
Arquivos de Acesso Aleatório (cont.)

I O método length retorna o tamanho do arquivo, em bytes;

I O método getFilePointer retorna a posição do cursor em


relação ao inı́cio do arquivo, em bytes

I O método seek define uma nova posição para o cursor,


medida a partir do inı́cio do arquivo, em que ocorrerá a
próxima operação de escrita ou leitura;

I O método close fecha o arquivo

64/92
[Link]

p u b l i c c l a s s Record {
private int id ;
p r i v a t e c h a r itemName [ ] = new c h a r [ 8 0 ] ;
p r i v a t e c h a r d e s c r i p t i o n [ ] = new c h a r [ 2 5 5 ] ;
p u b l i c s t a t i c f i n a l i n t SIZE = 6 7 4 ;

p u b l i c Record ( ) {
t h i s ( 0 , "" , "" ) ;
}

p u b l i c R e c o r d ( i n t i d , S t r i n g itemName , S t r i n g
description ) {
setId ( id ) ;
setItemName ( itemName ) ;
setDescription ( description ) ;
}

65/92
[Link] (cont.)
p ub l ic void writeFixedLengthString ( char f i e l d [ ] ,
String value , i n t s i z e ){
int length = value . length () < size ? value .
l e n g t h ( ) : s i z e −1;
int i ;
f o r ( i = 0 ; i < l e n g t h ; i ++){
f i e l d [ i ] = value . charAt ( i ) ;
}
f i e l d [ i ] = ’\0 ’ ;
}

public int getId () {


return id ;
}

public void setId ( int id ) {


this . id = id ;
}

66/92
[Link] (cont.)

p u b l i c S t r i n g getItemName ( ) {
r e t u r n new S t r i n g ( itemName ) ;
}

p u b l i c v o i d setItemName ( S t r i n g itemName ) {
w r i t e F i x e d L e n g t h S t r i n g ( t h i s . itemName , itemName ,
80) ;
}

public String getDescription () {


r e t u r n new S t r i n g ( d e s c r i p t i o n ) ;
}

67/92
[Link] (cont.)

public void setDescription ( String description ) {


writeFixedLengthString ( this . description ,
d e s c r i p t i o n , 255) ;
}

public String toString () {


r e t u r n S t r i n g . f o r m a t ( "\n %d %s %s" , g e t I d ( ) ,
getItemName ( ) , g e t D e s c r i p t i o n ( ) ) ;
}
}

68/92
[Link]

import java . u t i l . Scanner ;

public class CollectInfo {


S c a n n e r i n = new S c a n n e r ( System . i n ) ;
int id ;
S t r i n g itemName , d e s c r i p t i o n ;

public int getId () {


return id ;
}

public void setId ( int id ) {


this . id = id ;
}

p u b l i c S t r i n g getItemName ( ) {
r e t u r n itemName ;
}

69/92
[Link] (cont.)

p u b l i c v o i d setItemName ( S t r i n g itemName ) {
t h i s . itemName = itemName ;
}

public String getDescription () {


return description ;
}

public void setDescription ( String description ) {


this . description = description ;
}

70/92
[Link] (cont.)

public void accept () {


System . o u t . p r i n t l n ( " Enter your Id :" ) ;
id = in . nextInt () ;
in . nextLine () ;
System . o u t . p r i n t l n ( " Enter your ItemName " ) ;
itemName = i n . n e x t L i n e ( ) ;
System . o u t . p r i n t l n ( " Enter item Description " ) ;
description = in . nextLine () ;
}
}

71/92
[Link]

import java . io . File ;


import java . io . FileNotFoundException ;
import java . io . IOException ;
import java . io . RandomAccessFile ;

p u b l i c c l a s s RandomAccessFiles {

p r i v a t e s t a t i c v o i d w r i t e R e c o r d ( Record data ) {
RandomAccessFile f i l e = n u l l ;
try {
f i l e = new R a n d o m A c c e s s F i l e ( new F i l e ( "
record . dat " ) , " rw " ) ;
f i l e . s e e k ( d a t a . g e t I d ( ) ∗ R e c o r d . SIZE ) ;
f i l e . w r i t e I n t ( data . g e t I d () ) ;
f i l e . writeUTF ( d a t a . getItemName ( ) ) ;
f i l e . writeUTF ( d a t a . g e t D e s c r i p t i o n ( ) ) ;
}

72/92
[Link] (cont.)

catch ( FileNotFoundException e ){
System . e r r . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
}
catch ( IOException e ){
System . e r r . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
}
finally{
i f ( f i l e != n u l l ) {
try {
f i l e . close () ;
}
catch ( IOException e ){
System . e r r . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
}
}
}
}

73/92
[Link] (cont.)
p r i v a t e s t a t i c Record readRecord ( i n t s i d ) {
RandomAccessFile f i l e = n u l l ;
Record data = n u l l ;
try {
f i l e = new R a n d o m A c c e s s F i l e ( new F i l e ( "
record . dat " ) , " rw " ) ;
f i l e . s e e k ( s i d ∗ R e c o r d . SIZE ) ;
int id = f i l e . readInt () ;
S t r i n g itemName = f i l e . readUTF ( ) ;
S t r i n g d e s c r i p t i o n = f i l e . readUTF ( ) ;
d a t a = new R e c o r d ( i d , itemName , d e s c r i p t i o n ) ;
}
catch ( FileNotFoundException e ){
System . e r r . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
}
catch ( IOException e ){
System . e r r . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
}

74/92
[Link] (cont.)

finally{
i f ( f i l e != n u l l ) {
try {
f i l e . close () ;
}
catch ( IOException e ){
System . e r r . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
}
}
}
r e t u r n data ;
}

75/92
[Link] (cont.)

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
C o l l e c t I n f o c o l = new C o l l e c t I n f o ( ) ;
col . accept () ;

R e c o r d s u e = new R e c o r d ( c o l . g e t I d ( ) ,
c o l . getItemName ( ) ,
col . getDescription () ) ;

writeRecord ( sue ) ;

Record out = readRecord (12) ;


System . o u t . p r i n t l n ( o u t ) ;
}

76/92
[Link] (cont.)

Enter your Id :
12
E n t e r y o u r ItemName
Television
Enter item D e s c r i p t i o n
lcd

12 T e l e v i s i o n l c d

77/92
Outras formas de Leitura e Escrita de Arquivos

I Podem ser realizadas as operações de leitura/escrita em


arquivos de forma semelhante às operações de I/O do console

I File(): representação de um arquivo

I PrinterWriter(): usado para escrever em um arquivo da


mesma forma como [Link]

I Scanner(): usado para ler da mesma forma como [Link]

78/92
Outras formas de Leitura e Escrita de Arquivos (cont.)
import java . io . File ;
import java . io . FileNotFoundException ;
import java . io . FileOutputStream ;
import java . io . IOException ;
import java . io . PrintWriter ;
import java . u t i l . Scanner ;

public class JavaPrintWriter {


p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
F i l e f i l e = new F i l e ( " test . txt " ) ;
// escrita
try {
// se o arquivo existe apaga os dados
//PrintWriter out = new PrintWriter(file);
// append
P r i n t W r i t e r o u t = new P r i n t W r i t e r ( new
FileOutputStream ( f i l e , true ) ) ;
o u t . p r i n t l n ( " Mike Bolton " ) ;
out . p r i n t l n (42) ;
out . c l o s e ( ) ;
} 79/92
Outras formas de Leitura e Escrita de Arquivos (cont.)

catch ( IOException e ){
System . e r r . p r i n t l n ( e ) ;
}
// leitura
try {
S c a n n e r i n = new S c a n n e r ( f i l e ) ;
S t r i n g name = i n . n e x t L i n e ( ) ;
i n t age = i n . n e x t I n t ( ) ;
System . o u t . p r i n t l n ( name + " " + age ) ;
in . close () ;
}
catch ( FileNotFoundException e ){
System . e r r . p r i n t l n ( e ) ;
}
}

80/92
Exemplo 2 de Serialização : [Link]

import java . io . S e r i a l i z a b l e ;

p u b l i c c l a s s Student implements S e r i a l i z a b l e {
p r i v a t e S t r i n g name ;
p r i v a t e double grade ;

p u b l i c Student () {
t h i s ( "" , 0 . 0 ) ;
}
p u b l i c S t u d e n t ( S t r i n g name , d o u b l e g r a d e ) {
t h i s . name = name ;
t h i s . grade = grade ;
}

p u b l i c S t r i n g getName ( ) {
r e t u r n name ;
}

81/92
Exemplo 2 de Serialização : [Link] (cont.)

p u b l i c v o i d setName ( S t r i n g name ) {
t h i s . name = name ;
}

p u b l i c double getGrade () {
return grade ;
}

p u b l i c void setGrade ( double grade ) {


t h i s . grade = grade ;
}

public String toString () {


r e t u r n S t r i n g . f o r m a t ( "\n %s %f" , getName ( ) ,
getGrade () ) ;
}
}

82/92
[Link]
import java . i o . EOFException ;
import java . io . File ;
import java . io . FileInputStream ;
import java . io . FileNotFoundException ;
import java . io . FileOutputStream ;
import java . io . IOException ;
import java . io . ObjectInputStream ;
import java . i o . ObjectOutputStream ;
import java . u t i l . ArrayList ;

public class JavaSerialization {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) t h r o w s
FileNotFoundException , IOException ,
ClassNotFoundException {
F i l e f i l e = new F i l e ( " students . dat " ) ;
A r r a y L i s t <S t u d e n t > s t u d e n t s =new A r r a y L i s t <>() ;
s t u d e n t s . add ( new S t u d e n t ( " Tom " , 7 . 8 ) ) ;
s t u d e n t s . add ( new S t u d e n t ( " Dave " , 6 . 5 ) ) ;
s t u d e n t s . add ( new S t u d e n t ( " Bill " , 5 . 3 ) ) ;
83/92
[Link] (cont.)
// append
//FileOutputStream fo = new FileOutputStream(file,true);
//ObjectOutputStream out = new
AppendableObjectOutputStream(fo);
//serialize
FileOutputStream fo =
new F i l e O u t p u t S t r e a m ( f i l e ) ;
ObjectOutputStream out =
new O b j e c t O u t p u t S t r e a m ( f o ) ;
f o r ( Student s : students ) {
out . w r i t e O b j e c t ( s ) ;
}
out . c l o s e ( ) ;
fo . close () ;
// deserialize
F i l e I n p u t S t r e a m f i = new F i l e I n p u t S t r e a m ( f i l e ) ;
ObjectInputStream in =
new O b j e c t I n p u t S t r e a m ( f i ) ;
A r r a y L i s t <S t u d e n t > s t u d e n t s 2 =
new A r r a y L i s t <>() ;
84/92
[Link] (cont.)

try {
while ( true ){
S t u d e n t tmp = ( S t u d e n t ) i n . r e a d O b j e c t ( ) ;
s t u d e n t s 2 . add ( tmp ) ;
}
}
c a t c h ( EOFException e ) {

}
f o r ( Student s : students2 ) {
System . o u t . p r i n t l n ( s ) ;
}
}
}

85/92
[Link] (cont.)

Tom 7 . 8 0 0 0 0 0

Dave 6 . 5 0 0 0 0 0

B i l l 5.300000

86/92
[Link] (cont.)
Para permitir adicionar mais registros em um arquivo
import java . io . FileOutputStream ;
import java . io . IOException ;
import java . io . ObjectOutputStream ;
import java . io . OutputStream ;

p u b l i c c l a s s AppendableObjectOutputStream extends
ObjectOutputStream {

p u b l i c A p p e n d a b l e O b j e c t O u t p u t S t r e a m ( OutputStream
out ) throws IOException {
super ( out ) ;
}

@Override
protected void writeStreamHeader () throws
IOException {

}
}
87/92
Exemplo 3

import java . io . BufferedReader ;


import java . io . BufferedWriter ;
import java . io . FileInputStream ;
import java . io . FileOutputStream ;
import java . io . InputStreamReader ;
import java . io . OutputStreamWriter ;

public c l a s s JavaBuffered {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
try {
//FileOutputStream arq = new FileOutputStream(.[Link]”, true);
FileOutputStream arq =
new F i l e O u t p u t S t r e a m ( " arquivo . txt " ) ;
OutputStreamWriter os =
new O u t p u t S t r e a m W r i t e r ( a r q ) ;
B u f f e r e d W r i t e r o u t=new B u f f e r e d W r i t e r ( o s ) ;

88/92
Exemplo 3 (cont.)

o u t . w r i t e ( " 36 ; 56 ; 45\ n" ) ;


o u t . w r i t e ( " 46 ; 66 ; 55\ n" ) ;
o u t . w r i t e ( " 56 ; 76 ; 65\ n" ) ;
out . c l o s e ( ) ;
os . c l o s e ( ) ;
}
catch ( Exception e ){
System . e r r . p r i n t l n ( " Erro ao escrever o arquivo " ) ;
}

try {
FileInputStream arq =
new F i l e I n p u t S t r e a m ( " arquivo . txt " ) ;
InputStreamReader i s =
new I n p u t S t r e a m R e a d e r ( a r q ) ;
B u f f e r e d R e a d e r i n=new B u f f e r e d R e a d e r ( i s ) ;
String linha ;

89/92
Exemplo 3 (cont.)

do {
linha = in . readLine () ;
i f ( l i n h a != n u l l ) {
S t r i n g [ ] p a l a v r a s = l i n h a . s p l i t ( ";" ) ;
System . o u t . p r i n t l n ( "\ nNova linha ------" ) ;
for ( String s : palavras ){
System . o u t . p r i n t ( s + " " ) ;
}
}
} w h i l e ( l i n h a != n u l l ) ;
}
catch ( Exception e ){
System . e r r . p r i n t l n ( " Erro ao escrever o arquivo " ) ;
}
}
}

90/92
Saı́da

Nova l i n h a −−−−−−
36 56 45
Nova l i n h a −−−−−−
46 66 55
Nova l i n h a −−−−−−
56 76 65

91/92

Você também pode gostar