Escrevendo e lendo arquivos

30 respostas
N

Galera, tenho um programa básico que le dados de itens de estoque, como nome, descrição, nivel do estoque, nivel minimo e preço. Todos esses atributos estou na classe ItensEstoque, no qual contem os metodos get´s e set´s. Depois que um objeto é criado, jogo ele para o Array de objetos. O que eu quero fazer é jogar esse dados em um arquivos, por exemplo:
Codigo: 0
Nome : nome0
Descrição: descricao0
Estoque: 000
Estoque minimo: 0
Preço: 000

Codigo: 1
Nome : nome1
Descrição: descricao1
Estoque: 1
Estoque minimo: 1
Preço: 1

Alguem pode me auxiliar como fazer isso ??? E depois como fazer para le o arquivo e apresentar na tela ???

30 Respostas

ricardolecheta
PrintWriter out = new PrintWriter(new FileOutputStream("file.txt"));
out.println(...)
out.close
BufferedReader reader = new BufferedReader(FileReader("file.txt"));
String line = reader.readLine();
reader.close();

vc pode gravar um objeto inteiro assim;

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file.txt"));
out.writeObject(itensEstoque);
out.close();
ObjectInputStream out = new ObjectOutputStream(new FileInputStream("file.txt"));
itensEstoque item = out.readObject(itensEstoque);
out.close();
N

Não está dando certo… tenho q por esse código onde, na principal ?

Dando o seguinte erro :

Exception in thread “main” java.io.NotSerializableException: ItensEstoque
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
    at Prova.main(Prova.java:46)

Sabe oq é ?

wbsouza

Todo bean que você quiser gravar deve implementar a classe Serializable. Ou seja a sua Classe ItemsPedido deve ficar parecida com alguma coisa do tipo:

public class ItensEstoque implements Serializable {
    ...
    ...
    ...
}
wbsouza

ou melhor a interface Serializable

Sorry! :?

Pensei em interface, e escreví classe.

N

Eu até dei uma pesquisada, e vi que tinha que ter essa interface Serializable, mais não como colocar na classe ItensEstoque.

Teria que ter algo do tipo:

public interface Serializable {



}

É isso, o que mais tem q ter ?

ricardolecheta

a única coisa que precisa fazer é colocar "implements Serializable" na sua classe ItemsPedido .

isto indica que sua bean poderá fazer o que chamamos de serialização...

só isso.

"wbsouza":
public class ItemsPedido implements Serializable
{

   aqui vc continua sua classe normalmente 

}
P

Caros Colegas, tenho um problema. Como posso ter uma classe chamada LerCpfCgc, esta classe irá abrir um arquivo texto que contém CPF e Cgc Válidos e Inválidos. Ter outra classe chamada Utilitarios, esta classa por sua vez irá identificar se é cpf ou cgc e se esses são válidos ou inválidos e depois gravar os válidos em um arquivo de arquivos válidos e os inválidos. Todos os métodos são estáticos e estão prAaticamente prontos porém não consigo fazer com que a classe que le os cpfs e cgcs mandem estes para análise e gravação na classe utilitários

C

Pessoal sou novo no mundo Java, mas já tenho algumas encrencas pra arrumar, alguem pode me mandar um codigo que leia e compare nome de arquivos e pastas?!?!
Fico no aguardo de uma ajuda.
Obrigado!

ricardolecheta

veja a classe File.

File f = new File(“teste.txt”);

f… veja os metodos

deve ter o que vc quer

N

Realmente agora deu certo, consegui gerar o arquivo, mais voce precisa ver oq ele escreveu no arquivo, um monte de caracter estranhos, nem da pra achar oq eu digitei… ta mo esquisito, assim num dianta nada !!

¬í sr ItensEstoqueB¹†HøÂ¦ I CodZ FlagI
NivelAtualI NivelMinF PrecoF TotalItemL Descricaot Ljava/lang/String;L Nomeq ~ xp
Cz t aMonitort aMonitor

Isso que ta no arquivo, alguem sabe pq ???

ricardolecheta

para ler o arquivo use ObjectInputStream que funciona.

tá tudo certo com o arquivo, de uma pesquisada sobre serialização que vc vai entender…

o que acontece é que as informações não foram gravadas em modo texto, se vc quiser que seja asism use a classe PrintWriter e faça println.
Com o PrintWriter é a mesma coisa do que fazer System.out.println… só que é para arquivos

qualquer dúvida é só perguntar

N

Ahhh deixa queto !!! Ninguem ta conseguindo me ajudar… dicas pra la, dicas pra ca, mais como faze memo nada…

Valeu a ajuda ai !!! :cry:

ricardolecheta

no código que lhe passe anteriormente eu mostrei como se faz com o PrintWriter

PrintWriter out = new PrintWriter(new FileOutputStream("file.txt")); 
out.println(...) 
out.close()

Depois de abrir o arquivo, vc faz out.println() igual como se faz System.out.println(), então basta imprimir os valores do seu objeto chamando os métodos get

tente assim,

for(...array de objetos ...)
{
   out.println(seuObjeto.getNome());
   out.println(seuObjeto.getEstoque());
   out.println("------------------------");
}

assim faz em modo texto, é bem simples usar o PrintWriter. É igual fazer System.out.println();

N

Me ajuda no seguinte, entendi o que é pra fazer segue um trecho do meu código:

//Antes disso eu peço os dados e guardo através do set’s no objeto Itens

write.println("–> Codigo : " + Itens.getCod());

write.println("–> Nome : " + Itens.getNome());

write.println("–> Descricao : " + Itens.getDesc());

write.println("–> Nivel Atual : " + Itens.getNivelAtual());

write.println("–> Nivel Minimo : " + Itens.getNivelMin());

write.println("–> Preco : " + Itens.getPreco());

write.println("---------------------------------------------");

write.close();

Seria isso né ?

Se for me ajuda a criar uma outra classe por ser Arquivo onde teria os métodos de escreita e leitura do arquivo e passaria como parâmetro o objeto Itens, tem jeito ???

ricardolecheta

está certo como fez…

vc pode fazer algo assim:

public class Arquivo
{
	private String nameFile;
	private PrintWriter write;
	private BufferedReader reader;
	
	public Arquivo(String nameFile)
	{
		this.nameFile = nameFile;
	}
	
	public void write(ItensEstoque item)
	{
		write = new PrintWriter(new FileOutputStream(nameFile));

		write.println("--> Codigo : " + item.getCod()); 
		write.println("--> Nome : " + item.getNome());
		
		write.close();
	}
	
	public ItensEstoque read()
	{
		reader = new BufferedReader(new FileReader(nameFile));
		ItensEstoque item;
		String line = null;
		while ( (line = reader.readLine()) != null)
		{
			System.out.println(line);
			// agora vc precisa fazer uma parser para recuperar
			//somente o que quiser
			item.setCod(...);
			item.setNome(...);
		}

                                reader.close();                                

		return item;
	}
}
N

Isso mesmo… tava errando uma coisa no método de escrever, mais agora ta beleza.

Agora no método de ler num intendi, num caiu a ficha:

Tipo, pq criou um método para retornar o objeto Itens, num saquei ? e pq usa os métodos de set’s dentro desse método ?

ricardolecheta

vc vai ler do arquivo certo ?

ao fazer readLine() ele retorna a linha que vc escreveu:
vai retornar algo assim: “Codigo : 1” mas vc precisa somente do número 1.

eu fiz retornar um objeto porque ao ler do arquivo, vc cria um novo objeto
new ItensEstoque()… e depois da um “set” em todas as propriedades, então o objeto vai estar preenchido e pronto para ser retornado.

então fora do método, de quem o chamou, vc pode recuperar o objeto assim
ItensEstoque item = arquivo.read(); // le do arquivo e retorna um objeto
veja que seria melhor retornar uma lista

blz ?

N

Ahhhhhhh, agora saquei… mas agora não faço a mínima ideía de como pegar somente o 1 do “–> Codigo: 1”, poderia me ajudar. Me ajudando nesse acho que consigo fazer nos outros atributos.

Se num for abusa muito, como seria criar uma lista ? Como ficaria o código ?

Ahhh, ta dando erro na classe Arquivo que voce crio:

C:j2sdk1.4.1_02arquivos_javaFulanoArquivo.java:15: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
write = new PrintWriter(new FileOutputStream(NomeArquivo));

ricardolecheta

java.io.FileNotFoundException

vc precisa colocar tudo em um bloco try{}catch(Exception e){}

quanto a Lista crie um ArrayList e chame o método add(Object) para adicionar as instacias que vc criar… então retorne a lista ao invés de um objeto apenas

quanto ao arquivo utilize a classe StringTokenizer

N

Tipo, ta dando o seguinte Exception logo depois que entro com os dados e chama o método Arquivo que escreve no arquivo:

Exception in thread main java.lang.NullPointerException

at Arquivo.write(Arquivo.java:29)

at Prova.main(Prova.java:46)

Essa Exception é quando ela acessa alguma coisa ainda nula, mais num acho oq é. HELP!!!

Segue o código:

//Principal

Arq.Arquivo(entrada.txt);

Arq.write(ArrayItens[c]);

//Classe Arquivo

public class Arquivo {

private String NomeArquivo;

private PrintWriter write;

//private BufferedReader reader;
public void Arquivo(String nameFile){

this.NomeArquivo = NomeArquivo;

}
public void write(ItensEstoque Itens){

try {

write = new PrintWriter(new FileOutputStream(NomeArquivo));

write.println("–> Codigo : " + Itens.getCod());

write.println("–> Nome : " + Itens.getNome());

write.println("–> Descrição : " + Itens.getDesc());

write.println("–> Nivel Atual : " + Itens.getNivelAtual());

write.println("–> Nivel Minimo : " + Itens.getNivelMin());

write.println("–> Preco : " + Itens.getPreco());

write.close();

}

catch (FileNotFoundException e){

System.out.println(Arquivo não encontrado !!!);

}

finally{

write.close();

}

}

}
ricardolecheta
public void Arquivo(String nameFile){ 
this.NomeArquivo = NomeArquivo; 
}

o código acima está errado, não seria
this.NomeArquivo = nameFile; :wink:

N

Qual a melhor forma que voce acha que eu dave escrever no arquivo afim de facilitar a leitura depois, ou seja pegar apenas o que eu quero.

Eu pensei em escrever um linha assim:

1;Nome1;Descricao1;NivelAtual1;NivelMinimo1;Preco1;

2;Nome2;Descricao2;NivelAtual2;NivelMinimo2;Preco2;

Como eu faria para pegar cod, nome, descricao e retornar tudo como um objeto ?

Ou tem outra forma melhor de fazer ???

N

Poxa, não tem ninguem que pode me ajudar ???

Alowww…!!!

cancao

Olá, se vc vai manter a formatação do arquivo assim, vc poderia usar uma BufferedReader para ler linha a linha e depois usar uma StringTokenizer para dividir a linha. Depois, vc percorreria os tokens, e como vc sabe exatamente o que cada um deles representa, crie os objetos desejados com eles. Espero que isso ajude.

Até mais.

M

Olá pessoal,
Estou usando a dica do ricardolecheta para escrever e ler um objeto no arquivo texto:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file.txt"));
out.writeObject(meuObjeto);
out.close();


ObjectInputStream out = new ObjectOutputStream(new FileInputStream("file.txt"));
itensEstoque item = out.readObject(meuObjeto);
out.close();

porém dessa maneira ele sempre sobrescreve o objeto, minha intenção é gravar varios objetos no mesmo arquivo.
Como faço isso ? e para recuperar essa lista de objetos utilizo o readLine() ?
valeu

ricardolecheta

no construtor de FileOutputStream vc pode passar um boolean=true para fazer append no arquivo, senão ele sempre cria um novo :slight_smile:

M

nesse caso ele esta lendo um só !
até fiz assim e funcionou,
estou com difuculdades em fazer ele percorrer o arquivo e ir listando.
Quando eu usava o BufferedReader
eu usava o readline(),

mas no caso de ObjectInputStream acho que é de outra maneira.

Rogerio_JAVA

Fiz desse jeito e não dei certo.

N
"mindu":
e para recuperar essa lista de objetos utilizo o readLine() ?
Para ler, vc pode usar ObjectInputStream, FileInputStream.
ObjectInputStream input =
				new ObjectInputStream(
					new FileInputStream(new File(path)));
					
			Pessoa person = (Pessoa) input.readObject();
input.close();
N

try{ while(true) { //le os arquivos } } catch(EOFException eof) { input.close(); } ?

Criado 26 de junho de 2003
Ultima resposta 9 de jan. de 2004
Respostas 30
Participantes 9