Coleções e Arquivos

9 respostas
R
Galera, estou tentando fazer um programinha que, oferece opções de inserir no arquivo..e outras vou postar o codigo que fica mais fácil de entender.: *todos os métodos abaixo estão funcionando, exceto o último que no caso é o que eu quero fazer: o metodo deve percorrer todo o arquiso e ordenar um list pelo codigo do produto ou seja o produto a ser exibido primeiro é oq ue tem codigo 001 e o segundo 002, então criei um set que implementa treeset mas n estou conseguindo fazer o comparable..
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;



public class PersistenciaArquivos {

	public void criaArquivoProdutos(String nomeArquivo) throws IOException {
		
		String conteudo = "002+DVD+eletrônico\n"
			+ "001+Monitor+informática\n"
			+ "003+Batedeira+eletrodoméstico";
		
		File arquivo = new File(nomeArquivo);
		
		FileOutputStream stream = new FileOutputStream(arquivo);
		OutputStreamWriter writer = new OutputStreamWriter(stream);
		
		writer.write(conteudo);
		
		writer.close();
		stream.close();
		
	}
	
	public void imprime(String nomeArquivo) throws IOException {
		
		File arquivo = new File(nomeArquivo);
		
		FileInputStream stream = new FileInputStream(arquivo);
		InputStreamReader reader = new InputStreamReader(stream);
		BufferedReader bufReader = new BufferedReader(reader);
		
		String linha = bufReader.readLine();
		while (linha != null) {
			System.out.println(linha);
			linha = bufReader.readLine();
		}
		
		bufReader.close();
		reader.close();
		stream.close();
		
	}
	
	public List<Produto> carregaProdutos(String nomeArquivo, int quantidade) throws IOException {
		
		List<Produto> retorno = new LinkedList<Produto>();
		
		File arquivo = new File(nomeArquivo);
		
		FileInputStream stream = new FileInputStream(arquivo);
		InputStreamReader reader = new InputStreamReader(stream);
		BufferedReader bufReader = new BufferedReader(reader);
		
		while (quantidade > 0) {
			String linha = bufReader.readLine();
			
			if (linha != null) {
				String[] valores = linha.split("\+");
				Produto prod = new Produto(valores[0], valores[1], valores[2]);
				retorno.add(prod);
			} else {
				break;
			}
			
			quantidade--;

		}
		
		bufReader.close();
		reader.close();
		stream.close();
		
		return retorno;
		
	}
	public void percorrer(String nomeArquivo) throws FileNotFoundException{
		
		Set percorrer = new TreeSet();
		File arquivo = new File(nomeArquivo);
		
		FileInputStream stream = new FileInputStream(arquivo);
		InputStreamReader reader = new InputStreamReader(stream);
		BufferedReader bufReader = new BufferedReader(reader);
		
		
	}
	
	
}
Classe produto, onde eu qeuro ordenar pelo código:
public class Produto {

	private String codigo;
	private String descricao;
	private String tipo;

	public Produto() {
		super();
	}

	public Produto(String codigo, String descricao, String tipo) {
		super();
		this.codigo = codigo;
		this.descricao = descricao;
		this.tipo = tipo;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	@Override
	public String toString() {
		return "Produto [codigo="
		+ (codigo == null ? "" : codigo) 
		+ ", descricao=" + (descricao == null ? "" : descricao)
				+ ", tipo=" + (tipo == null ? "" : tipo) + "]";
	}

	
	
}

e o MAin:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;
;

public class TestIO {
	
	public static void main(String[] args) {
		
		PersistenciaArquivos p = new PersistenciaArquivos();
		
		String nomeArquivo = "produtos.txt";

		Scanner scanner = new Scanner(System.in);
		
		System.out.print("Entre o comando: ");
		String cmd = scanner.nextLine();
		
		while (!"0".equalsIgnoreCase(cmd)) {
			if ("1".equalsIgnoreCase(cmd)) {
				try {
					p.criaArquivoProdutos(nomeArquivo);
				} catch (IOException e) {
					e.printStackTrace();
					System.out.println("Erro ao tentar gerar arquivo: " + nomeArquivo);
				}
			} else if ("2".equalsIgnoreCase(cmd)) {
				try {
					p.imprime(nomeArquivo);
				} catch (FileNotFoundException e) {
					System.out.println("Arquivo " + nomeArquivo + " não disponível.");
				} catch (IOException e) {
					System.out.println("Erro ao tentar imprimir arquivo: " + nomeArquivo);
				}
			} else if ("3".equalsIgnoreCase(cmd)) {
				try {
					List<Produto> produtos = p.carregaProdutos(nomeArquivo, 3);
					System.out.println(produtos);
				} catch (FileNotFoundException e) {
					System.out.println("Arquivo " + nomeArquivo + " não disponível.");
				} catch (IOException e) {
					System.out.println("Erro ao tentar imprimir arquivo: " + nomeArquivo);
				}
			} else {
				System.out.println("Comando indisponível!");
			}
			System.out.print("Entre o comando: ");
			cmd = scanner.nextLine();
		}
		
	}
	

}

agradeço ...

9 Respostas

romarcio

Primeiro muda no método carregaProdutos o que é List por Set e o LinkedList por TreeSet.

Depois na classe Produto faz assim:

public class Produto implements Comparable<Produto> {
//demais codigos

    public int compareTo(Produto o) {
        return this.getCodigo().compareTo(o.getCodigo());
    }
}

E não esqueça de mudar o retorno do método carregaProdutos para Set e no método main também mude para Set no item 3.

Sua saida vai ser assim:
Entre o comando: 3

[Produto [codigo=001, descricao=Monitor, tipo=informática], Produto [codigo=002, descricao=DVD, tipo=eletrônico], Produto [codigo=003, descricao=Batedeira, tipo=eletrodoméstico]]
R
Exception in thread main java.lang.ClassCastException: Produto cannot be cast to java.lang.Comparable

at java.util.TreeMap.put(Unknown Source)

at java.util.TreeSet.add(Unknown Source)

at PersistenciaArquivos.carregaProdutos(PersistenciaArquivos.java:75)

at TestIO.main(TestIO.java:41)

fiz tudo isso e o erro foi esse acima

romarcio

Posta o método alterado e a classe Produto.

R

beleza,,

public Set<Produto> carregaProdutos(String nomeArquivo, int quantidade) throws IOException {
		
		Set<Produto> retorno = new TreeSet<Produto>();
		
		File arquivo = new File(nomeArquivo);
		
		FileInputStream stream = new FileInputStream(arquivo);
		InputStreamReader reader = new InputStreamReader(stream);
		BufferedReader bufReader = new BufferedReader(reader);
		
		while (quantidade > 0) {
			String linha = bufReader.readLine();
			
			if (linha != null) {
				String[] valores = linha.split("\+");
				Produto prod = new Produto(valores[0], valores[1], valores[2]);
				retorno.add(prod);
			} else {
				break;
			}
			
			quantidade--;

		}
		
		bufReader.close();
		reader.close();
		stream.close();
		
		return retorno;
		
	}
agora a classe
public class Produto {

	private String codigo;
	private String descricao;
	private String tipo;

	public Produto() {
		super();
	}

	public Produto(String valores, String descricao, String tipo) {
		super();
		this.codigo = valores;
		this.descricao = descricao;
		this.tipo = tipo;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	@Override
	public String toString() {
		return "Produto [codigo="
		+ (codigo == null ? "" : codigo) 
		+ ", descricao=" + (descricao == null ? "" : descricao)
				+ ", tipo=" + (tipo == null ? "" : tipo) + "]";
	}

    public int compareTo(Produto o) {  
        return this.getCodigo().compareTo(o.getCodigo());  
    }  
}
lembrando que o codigo eu ja tentei alterar pra inteiro e não deu
romarcio

Olha a assinatura da tua classe Produto e a assinatura da classe Produto que eu te passei.

R

Ok, beleza muito obrigado

romarcio

:thumbup:

Coloca seu post como resolvido.

R

Código resolvido: lembrando ele ordenou, agora estou tentando fazer uma método de pesquisa onde eu informo o código e ele retorna o código e o produto equivalente

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;



public class PersistenciaArquivos {

	public void criaArquivoProdutos(String nomeArquivo) throws IOException {
		
		String conteudo = "002+DVD+eletrônico\n"
			+ "001+Monitor+informática\n"
			+ "003+Batedeira+eletrodoméstico";
		
		File arquivo = new File(nomeArquivo);
		
		FileOutputStream stream = new FileOutputStream(arquivo);
		OutputStreamWriter writer = new OutputStreamWriter(stream);
		
		writer.write(conteudo);
		
		writer.close();
		stream.close();
		
	}
	
	public void imprime(String nomeArquivo) throws IOException {
		
		File arquivo = new File(nomeArquivo);
		
		FileInputStream stream = new FileInputStream(arquivo);
		InputStreamReader reader = new InputStreamReader(stream);
		BufferedReader bufReader = new BufferedReader(reader);
		long tam = arquivo.length();
		System.out.println("tamanho em bytes: "+tam);
		String linha = bufReader.readLine();
		while (linha != null) {
			System.out.println(linha);
			linha = bufReader.readLine();
		}
		
		bufReader.close();
		reader.close();
		stream.close();
		
	}
	
	public Set<Produto> carregaProdutos(String nomeArquivo, int quantidade) throws IOException {
		
		Set<Produto> retorno = new TreeSet<Produto>();
		
		File arquivo = new File(nomeArquivo);
		
		FileInputStream stream = new FileInputStream(arquivo);
		InputStreamReader reader = new InputStreamReader(stream);
		BufferedReader bufReader = new BufferedReader(reader);
		
		while (quantidade > 0) {
			String linha = bufReader.readLine();
			
			if (linha != null) {
				String[] valores = linha.split("\+");
				Produto prod = new Produto(valores[0], valores[1], valores[2]);
				retorno.add(prod);
			} else {
				break;
			}
			
			quantidade--;

		}
		
		bufReader.close();
		reader.close();
		stream.close();
		
		return retorno;
		
	}
	public void apagar(String nomeArquivo) throws IOException{
		
		String conteudo = "";
		
		File arquivo = new File(nomeArquivo);
		
		FileOutputStream stream = new FileOutputStream(arquivo);
		OutputStreamWriter writer = new OutputStreamWriter(stream);
		
		writer.write(conteudo);
		
		writer.close();
		stream.close();
		
		
	}
	public void pesquisar(String nomeArquivo,String cd) throws IOException, ClassNotFoundException{
		File arquivo = new File(nomeArquivo);
		
		FileInputStream stream = new FileInputStream(arquivo);
		ObjectInputStream obj = new ObjectInputStream(stream);
		Produto p = (Produto)obj.readObject();
		if(cd.equalsIgnoreCase(p.getCodigo())){
			System.out.println(p.getCodigo());
		}
		
		
	}
}
public class Produto implements Comparable<Produto> {

	private String codigo;
	private String descricao;
	private String tipo;

	public Produto() {
		super();
	}

	public Produto(String valores, String descricao, String tipo) {
		super();
		this.codigo = valores;
		this.descricao = descricao;
		this.tipo = tipo;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	@Override
	public String toString() {
		return "Produto [codigo="
		+ (codigo == null ? "" : codigo) 
		+ ", descricao=" + (descricao == null ? "" : descricao)
				+ ", tipo=" + (tipo == null ? "" : tipo) + "]";
	}

	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof Produto))
			return false;
		Produto other = (Produto) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		return true;
	}
	
    public int compareTo(Produto o) {  
        return this.getCodigo().compareTo(o.getCodigo());  
    }  
}
romarcio

Faz o seguinte, ao invés de pesquisar no arquivo, pesquisa na lista depos de carregar o arquivo nela.
É muito mais fácil.

Criado 12 de junho de 2011
Ultima resposta 12 de jun. de 2011
Respostas 9
Participantes 2