Manipulação de Arquivo com JSF

Eu preciso pegar informações específicas do arquivo e imprimir na tela do Extrato da conta (que está em Html), só que eu não tenho idéia de como fazer alguém pode me ajudar.

    package classes.menu;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;




@ManagedBean
public class Cadastro {
	public String nome;
	public int numAge;
	public String numConta;

	

	public String getNumConta() {
		return numConta;
	}

	public void setNumConta(String numConta) {
		this.numConta = numConta;
	}

	public void setNumAge(int numAge) {
		this.numAge = numAge;
	}

	public double getSaldo() {
		return saldo;
	}

	public void setSaldo(double saldo) {
		this.saldo = saldo;
	}

	public double saldo;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public int getNumAge() {
		return numAge;
	}

	public void gravar() {
		
		try {
			FileOutputStream arquivo = new FileOutputStream("C:\\Users\\e803823\\Documents\\Menu\\Arquivos\\dados.txt", true);
			PrintWriter pr = new PrintWriter(arquivo);
			
		 pr.print("Numero da Agencia :" + numAge);
		 pr.print("Numero da Conta :" + numConta);
		 pr.print("Saldo :" + saldo);
		 pr.println("Nome:" + nome);
		 
		 pr.close();
		 arquivo.close();
		} catch (Exception e) {
			System.out.println("Erro escrever arquivo");
		}
		
		
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Mensagem de confirmação:","Gravado com sucesso!"));
		
	}
	
	
	public void ler() {
		try {
			FileInputStream arquivo = new FileInputStream("C:\\Users\\e803823\\Documents\\Menu\\Arquivos\\dados.txt");
			InputStreamReader input = new InputStreamReader(arquivo);
			@SuppressWarnings("resource")
			BufferedReader br = new BufferedReader(input);
			
			
			String linha;
			do{
				linha = br.readLine();
				if(linha != null){
					
					String[] palavras = linha.split(";");
					System.out.println("Nova linha");
					for (int i = 0; i < palavras.length; i++) {
						numConta = palavras[i];
					}
					System.out.println("O que esta imprimindo "+numConta);
				}
			}while(linha != null);
			
		
		} catch (Exception e) {
			System.out.println("Erro ler arquivo");
		}
	}
		
}

<h:head>

</h:head>
<h:body>

Tela Cadastro:


<h:form>
<h:panelGrid id=“grid” columns=“3” cellpadding=“5”>
<p:outputLabel for=“default” value=“Número da Agência:” />
<p:inputText id=“default” required=“true” value="#{cadastro.numAge}" />
<p:message for=“default” />
	<p:outputLabel for="icon" value="Número da Conta:" />
    <p:inputText id="icon" required="true" value="#{cadastro.numConta}"/>
    <p:message for="icon" display="icon" />	
	
    <p:outputLabel for="tt" value="Saldo:" />
    <p:inputText id="tt" required="true" value="#{cadastro.saldo}"/>
    <p:message for="tt" display="tooltip" />
    
    <p:outputLabel for="txt" value="Nome:" />
    <p:inputText id="txt" required="true" value="#{cadastro.nome}"/>
    <p:message for="txt" display="text" />

</h:panelGrid>
	<p:messages id="messages" showDetail="true" autoUpdate="true"
		closable="true" />

	<p:commandButton value="Sim" actionListener="#{mensagemCadastro.sim}" update="grid"/>
	<p:commandButton value="Não" actionListener="#{mensagemCadastro.nao}" />
	<p:commandButton value="Gravar" actionListener="#{cadastro.gravar()}" />
	<p:commandButton value="ler" actionListener="#{cadastro.ler}" />

</h:form>

</h:body>

<h:head></h:head>
<h:body>
	<h3>Extrato da Conta:</h3>
	<p:panelGrid columns="2">
	<h:outputText value="Número da Agência: " />
	<h:outputText value="#{cadastro.numAge}" />
	
	<h:outputText value="Número da Conta: " />
	<h:outputText value="#{cadastro.numConta}" />
	
	<h:outputText value="Nome do Usuário da Conta: " />
	<h:outputText value="#{cadastro.nome}" />
	
	<h:outputText value="Saldo Atual: " />
	<h:outputText value="#{saque.saldo}" />
	
	</p:panelGrid>
</h:body>

Bom, basicamente, posso ver que você já tem o código praticamente pronto.
Agora, precisamos saber como o arquivo a ser lido está e qual a dificuldade, exata, que você encontra.

O arquivo a ser lido ele está assim:

Nome;kati;
Numero da Conta;2222Nome;eu;
Numero da Conta;2222Nome;Feliz;
Numero da Conta;8888Nome;kati;
Numero da Conta;2222Numero da Agencia :222222Numero da Conta :2222Saldo :0.02222Nome:kati
Numero da Agencia :222222Numero da Conta :5555Saldo :0.02222Nome:kati

Eu não estou conseguindo pegar uma informação específica e imprimir na tela do Extrato da Conta(último código)

O arquivo está formatado corretamente?

Nome;kati;
Numero da Conta;2222Nome;eu;
Numero da Conta;2222Nome;Feliz;
Numero da Conta;8888Nome;kati;
Numero da Conta;2222Numero da Agencia :222222Numero da Conta :2222Saldo :0.02222Nome:kati
Numero da Agencia :222222Numero da Conta :5555Saldo :0.02222Nome:kati

Pois, se este é o formato a ser lido, você vai ter sim, muita dificuldade em ler os dados, afinal, não existe um padrão que defina qual a informação em cada linha

Quando rodo o código ele grava assim, tem alguma forma de gravar cada coisa em uma linha?

Tem

pr.print("Numero da Agencia :" + numAge + "\n");
pr.print("Numero da Conta :" + numConta + "\n");
pr.print("Saldo :" + saldo + "\n");
pr.println("Nome:" + nome);

Uma alternativa seria gravar tudo em uma única linha, separando por “,” ou “;”

    pr.print("Numero da Agencia :" + numAge + ";");
    pr.print("Numero da Conta :" + numConta + ";");
    pr.print("Saldo :" + saldo + ";");
    pr.println("Nome:" + nome + ";");//Aqui coloca-se o ; e o \n para indicar o término da linha

Caso não haja necessidade de abrir o arquivo para leitura, fora do programa, eu optaria por mudar as labels para algo mais simples

    pr.print("AGENCIA:" + numAge + "\n");
    pr.print("CONTA:" + numConta + "\n");
    pr.print("SALDO:" + saldo + "\n");
    pr.println("NOME:" + nome);

E substituiria a leitura para algo assim

        String agencia = "", conta = "", saldo = "", nome = "";
        Scanner sc = new Scanner(new File("C:\\temp\\contas.txt"));
        while(sc.hasNextLine()) {
            agencia = sc.nextLine();
            conta = sc.nextLine();
            saldo = sc.nextLine();
            nome = sc.nextLine();
        }
        sc.close();

        System.out.println("Nome: " + nome.split(":")[1]);
        System.out.println("Agência: " + agencia.split(":")[1]);
        System.out.println("Conta: " + conta.split(":")[1]);
        System.out.println("Saldo: " + saldo.split(":")[1]);

O risco dessa abordagem é que a informação a ser exibida sempre será referente ao último registro gravado.
Uma simples verificação por nome já resolve (dentro do while).

1 curtida

Muito Obrigado Luis , vou tentar aqui ,qualquer coisa te falo

Ah sim, se optar pela abordagem de gravar tudo em uma linha, pode resolver o problema assim:

pr.print(numAge + “;”);//Agência
pr.print(numConta + “;”);//Conta
pr.print(saldo + “;”);//Saldo
pr.println(nome + “;”);//Nome

E a leitura ficaria parecida com isso

String agencia = "", conta = "", saldo = "", nome = "";
Scanner sc = new Scanner(new File("C:\\temp\\contas.txt"));
while(sc.hasNextLine()) {
        String linha = sc.nextLine();
        String partes[] = linha.split(";");
        agencia = partes[0];
        conta = partes[1];
        saldo = partes[2];
        nome = partes[3];
    }
    sc.close();

        System.out.println("Nome: " + nome);
        System.out.println("Agência: " + agencia);
        System.out.println("Conta: " + conta);
        System.out.println("Saldo: " + saldo);
1 curtida

Deu certo, muito obrigada !!!:grinning:

Agora não estou conseguindo imprimir na tela com JSF

Veja que, na tela, você tem os atributos mapeados da seguinte maneira

<h:outputText value="Número da Agência: " />
<h:outputText value="#{cadastro.numAge}" />

<h:outputText value="Número da Conta: " />
<h:outputText value="#{cadastro.numConta}" />
	
<h:outputText value="Nome do Usuário da Conta: " />
<h:outputText value="#{cadastro.nome}" />
	
<h:outputText value="Saldo Atual: " />
<h:outputText value="#{saque.saldo}" />

Onde leu agência, precisa atribuir à variável numAge, onde leu conta, atribuir à variável numConta, onde leu nome, atribuir à variável nome.

Vou tentar, que eu uso essas variaveis para outras coisas

Eu me referi a estas variáveis por ser a única fonte de apresentação que encontrei.
Se precisa de algo diferente, talvez seja interessante criar um xhtml específico para isso.

ok, vou tentar,obrigada

package classes.menu;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import classes.menu.Cadastro;;

@ManagedBean
public class Dados extends Cadastro {
public String nome;
public int numAge;
public String numConta;
public String agencia = “”;
public String conta = “”;
public String Asaldo = “”;
public String Anome = “”;

public String getNumConta() {
	return numConta;
}

public void setNumConta(String numConta) {
	this.numConta = numConta;
}

public void setNumAge(int numAge) {
	this.numAge = numAge;
}

public double getSaldo() {
	return saldo;
}

public String getAgencia() {
	return agencia;
}

public void setAgencia(String agencia) {
	this.agencia = agencia;
}

public String getConta() {
	return conta;
}

public void setConta(String conta) {
	this.conta = conta;
}

public String getAsaldo() {
	return Asaldo;
}

public void setAsaldo(String asaldo) {
	Asaldo = asaldo;
}

public String getAnome() {
	return Anome;
}

public void setAnome(String anome) {
	Anome = anome;
}

public void setSaldo(double saldo) {
	this.saldo = saldo;
}

public double saldo;

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public int getNumAge() {
	return numAge;
}

public void gravar() {
	
	try {
		FileOutputStream arquivo = new FileOutputStream("C:\\Users\\e803823\\Documents\\Menu\\Arquivos\\dados.txt", true);
		PrintWriter pr = new PrintWriter(arquivo);
		
		    pr.print("AGENCIA:" + numAge + "\n");
		    pr.print("CONTA:" + numConta + "\n");
		    pr.print("SALDO:" + saldo + "\n");
		    pr.println("NOME:" + nome);
	 
	 pr.close();
	 arquivo.close();
	} catch (Exception e) {
		System.out.println("Erro escrever arquivo");
	}
	
	
	FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Mensagem de confirmação:","Gravado com sucesso!"));
	
}


public void ler() throws FileNotFoundException {
	
        Scanner sc;
	
			sc = new Scanner(new File("C:\\Users\\e803823\\Documents\\Menu\\Arquivos\\dados.txt"));
		
        while(sc.hasNextLine()) {
            agencia = sc.nextLine();
            conta = sc.nextLine();
            Asaldo = sc.nextLine();
            Anome = sc.nextLine();
        }
        sc.close();

        System.out.println("Nome: " + Anome.split(":")[1]);
        System.out.println("Agência: " + agencia.split(":")[1]);
        System.out.println("Conta: " + conta.split(":")[1]);
        System.out.println("Saldo: " + Asaldo.split(":")[1]);
}

}

Estou fazendo assim, mas mesmo assim não está indo

Neste caso, você pode ignorar esta parte do código. Era apenas para exemplificar.
Além disso, você está tentando exibir estes dados a partir deste botão?

Se sim, você precisa definir onde estes dados serão exibidos, utilizando a propriedade “update” do commandButton.

Mas eu preciso que aparece na tela do Extrato da conta, já fiz de tudo esse negócio não da certo

Vamos por partes.
Você dispara o evento clicando no botão “Ler”, certo? Esse evento direciona a tua requisição à página “Extrato da conta”?

Não este botão ler eu só coloquei, para saber que ta imprimindo certo, seria só para mim não para o usuário. A página Extrato de conta é uma coisa separada

Entendi, então você acessa a página extrado de conta e ela vem com os dados em branco, certo?
Isso ocorre por você não ter vinculado os valores referentes aos campos antes de carregar o xhtml.
Para resolver esse problema, você precisa utilizar a tag f:metadata

<f:metadata>
    <f:event type="preRenderView" listener="#{nomeDoBean.metodoASerExecutado}"/>
</f:metadata>

Onde nomeDoBean é o nome do managed bean em uso e o nome do método pode ser substituído por ler