Pessoal, tenho que salvar os elementos de uma jlist em um .txt. A jlist é alimentada a partir de um jtextfield. Criei uma classe Arquivo onde o método salvar tem como atributo uma String. Ao chamar o método salvar (através de um botão), não consigo passar os elementos da jlist como string (não encontrei um método que retorne uma string do model da jlist). Agradeço desde já.
Salvar jlist em txt
40 Respostas
mbastos73 o método para retornar o valor do model do Jlist é o:
onde i seria o índice.
Sendo assim para retornar todos os valores basta apenas jogar em um laço for.
Mto obrigado. Vou tentar!
Consegui salvar, só que agora não consigo ler.
Tenho que fazer um exercício onde em uma combobox tenho os Estados brasileiros; em um jtextfield digito a cidade e com um botão adiciono à jlist daquele estado; qdo tiver todas as cidades que quero, clico em um botão salvar, que chama um metodo salvar da classe Arquivo e salva em txt, com o nome do estado como nome do arquivo. Até aqui consegui (faltava conseguir retirar os elementos da jlist, mas consegui com a ajuda do forista acima). Mas o arquivo deveria ser lido qdo selecionasse o estado correspondente (na combobox), através de um método ler da classe Arquivo. Este método retorna uma String. Mas não tem jeito, da uma mensagem de “Stream Closed” (dentro da jlist) qdo seleciono um Estado.
O código action da combobox:
private void jCBxEstadosActionPerformed(java.awt.event.ActionEvent evt) {
// if(jCBxEstados.getSelectedIndex()>0){
a=new Arquivo((String)jCBxEstados.getSelectedItem()+".txt");
// if(a.exists()){
lstModel.addElement(a.ler());
jList1.setModel(lstModel);
// }else{
// jList1.setModel(lstModel);
// lstModel.clear();
// }
//}
}
o Código do metodo salvar da Classe Arquivo: (o codigo anterior, da combobox, está confuso porque tentei um monte de coisa, e não quis deletar, pois podia ter que voltar)
public String ler(){
String texto="";
String conteudo="";
try{
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while((conteudo=br.readLine())!=null){
texto=texto+conteudo+"\n";
br.close();
arqLe.close();
}
}catch(Exception e){
texto=e.getMessage();
}
return texto;
}
Alguma santa dica de onde está o erro???
mbastos73 me explica qual sua dúvida.
Vc está tendo problemas para ler ou para gravar o arquivo?
Urbgames, obrigado pelo interesse. Meu problema está em ler o .txt. Já consigo gravar (qdo abro o arquivo pelo bloco de notas, todas as informações estão em uma única linha), mas qdo o arquivo é lido plo método, ele aparece na jlist com uma única linha (todas as informações em uma única linha), e não uma abaixo da outra, como seria uma lista. Teve uma das vezes que acrescentei um \r antes do \n, e no bloco de notas aparece uma informação por linha, mas qdo vai para a jlist fica tudo em uma linha só. já fucei no google e em foruns, mas não acho nada que funcione no meu caso, embora outros tenham conseguido.
Grato.
Urbgames, apenas par familiarizar com a dúvida, seguem os respectivos codigos do jbtn salvar e gravar (este da classe Arquivo):
private void jBtnSalvarActionPerformed(java.awt.event.ActionEvent evt) {
jList1.setModel(lstModel);
if(jCBxEstados.getSelectedIndex()>0){
if((lstModel.getSize())>0){
a=new Arquivo((String)jCBxEstados.getSelectedItem()+".txt");
String jlItens="";
for(int i=0;i<lstModel.getSize();i++){
jlItens=jlItens + ((String)lstModel.getElementAt(i)+"\r\n");
}
a.gravar(jlItens);
jList1.setModel(lstModel);
lstModel.clear();
}else{
JOptionPane.showMessageDialog(this, “Lista vazia! Impossível salvar”);
}
}else{
JOptionPane.showMessageDialog(this, “Selecione um Estado”);
}
}
public String gravar(String texto){
try{
FileWriter arqGrava=new FileWriter(this.nomeArquivo,false);
PrintWriter arqDados=new PrintWriter(arqGrava);
arqDados.println(texto);
arqDados.close();
arqGrava.close();
return null;
}
catch(Exception e){
return e.getMessage();
}
}
mbastos73 deixe no esquema para gravar linha por linha.
Não sei como vc está lendo seu arquivo, porém uma opção seria utilizar um BufferedReader passando um FileReader, onde este último carregaria o arquivo a ser lido.
para ler linha por linha utilize o método:
para ler todo o arquivo jogue a instrução acima de um laço while com a condição:
ficando assim:
while (objetoBufferedReader.ready())) {
texto = objetoBufferedReader.readLine();
}
Daí é só jogar os textos no Jlist.
Qualquer coisa dá um grito ai!
Perdão, deveria enviar o codigo do ler; segue abaixo: (creio ser como tu disseste)
public String ler(){
String texto="";
String conteudo="";
try{
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while((conteudo=br.readLine())!=null){
texto=texto+conteudo;
}
br.close();
arqLe.close();
}catch(Exception e){
e.getMessage();
}
return texto;
}
mbastos73 só para complementar, para não dar muito trabalho fazendo gambiarra na hora de gravar.
Faz o seguinte, de forma análoga a ler, implementa para ele gravar tbm. Com os objetos do tipo BufferedWriter e FileWriter.
Para gravar o valor no arquivo utiliza o seguinte esquema:
objetoBufferedWriter.write("textoASerGravado");
//pular linha
objetoBufferedWriter.newLine();
//salvar arquivo
objetoBufferedWriter.flush();
//ou
objetoBufferedWriter.close();
mbastos73 vc está utilizando a instrução:
e isto concatena o texto o deixando em uma linha só, para solucionar isso ou vc joga já no Jlist ou manda para um array.
Vc tem que passar texto por texto, se concatenar vai ficar em uma linha só.
Urbgames, deixei assim:
public String gravar(String texto){
try{
FileWriter arqGrava=new FileWriter(this.nomeArquivo,false);
//PrintWriter arqDados=new PrintWriter(arqGrava);
BufferedWriter arqDados=new BufferedWriter(arqGrava);
arqDados.write(texto);
arqDados.newLine();
// arqDados.println(texto);
arqDados.close();
arqGrava.close();
return null;
}
catch(Exception e){
return e.getMessage();
}
}
-----------------------------------------------------------------
public String ler(){
String texto = null;
String conteudo="";
try{
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while(br.ready()){
texto = br.readLine();
}
br.close();
arqLe.close();
}catch(Exception e){
e.getMessage();
}
return texto;
}
E agora bugou legal! Nem lê! Não aparece nada.
A primeira linha do arquivo, qdo abro no editor, aparece null (!!!)
O problema está, eu acho, na inicialização da variavel texto como null. não seria isto? Se sim, como inicializar ela?
Creio que vc esteja tendo problema no momento de referenciar o local dos arquivo.
Para isso crie um arquivo txt e jogue dentro do seu projeto e utilize a seguinte instrução:
File arquivo= new File(getClass().getResource("nomeDoArquivo.txt").toURI());
Ao instanciar os objetos do tipo FileWriter e FileReader passe o arquivo.
E para confirmar veja se o arquivo está sendo alterado.
Para resolver seu problema com o null altera teu while, para ele ficar desta forma:
while (objetoBufferedReader.ready()) {
//exemplo...
texto = oi2.readLine();
System.out.println(texto);
}
Creio que vc esteja tendo problema no momento de referenciar o local dos arquivo.Para isso crie um arquivo txt e jogue dentro do seu projeto e utilize a seguinte instrução:
File arquivo= new File(getClass().getResource("nomeDoArquivo.txt").toURI());Ao instanciar os objetos do tipo FileWriter e FileReader passe o arquivo.
E para confirmar veja se o arquivo está sendo alterado.
Os arquivos estão sendo salvos dentro do projeto, então não deve ser isto.
Para resolver seu problema com o null altera teu while, para ele ficar desta forma:Já tentei algo parecido; já alterei a sequencia das linhas do código; por fim está assim: FileReader arqLe=new FileReader(this.nomeArquivo); BufferedReader br=new BufferedReader(arqLe); while((conteudo=br.readLine())!=null){ texto = br.readLine(); ---------------------- Está salvando sem o null, mas ainda não consigo ler (não aparece na jlist)!!!!while (objetoBufferedReader.ready()) { //exemplo... texto = oi2.readLine(); System.out.println(texto); }
.
mbastos73 me envia teus arquivo, que ai comento o erro e vc conserta.
Via MP?
??
Manda aqui mesmo pelo fórum, Attachments.
Segue as classes zipadas.
Segue um .txt como para veres como está salvando.
Todo o projeto:
Só 1 instante.
Mais alguma dica para resolver o “caso”? Mudei o codigo do método ler novamte. Segue abaixo:
public String ler(){
String texto = “”;
String conteudo="";
try{
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while((conteudo=br.readLine())!=null){
texto =texto+conteudo+"\r\n";
}
br.close();
arqLe.close();
}catch(Exception e){
e.getMessage();
}
return texto;
}
Apesar de concatenar as strings, é o único jeito que aparece algo na jlist!!!
mbastos73 dei uma alterada no código na parte de ler e gravar e está funcionando bacana.
package arquivioComboList;
import java.io.*;
import java.util.ArrayList;
import javax.swing.ListModel;
public class Arquivo {
private String nomeArquivo;
private FileReader reader;
private FileWriter write;
private BufferedReader bufferReader;
private BufferedWriter bufferWrite;
private File arquivo;
public Arquivo (String nomeArquivo){
this.nomeArquivo=nomeArquivo;
//passando nome do arquivo
arquivo = new File(nomeArquivo);
}
public String gravar(String texto){
try{
//Criar arquivo se não existir
arquivo.createNewFile();
write = new FileWriter(arquivo);
bufferWrite = new BufferedWriter(write);
//adicionando texto ao arquivo
bufferWrite.write(texto);
bufferWrite.newLine();
bufferWrite.close();
/*
FileWriter arqGrava=new FileWriter(this.nomeArquivo,false);
PrintWriter arqDados=new PrintWriter(arqGrava);
//BufferedWriter arqDados=new BufferedWriter(arqGrava);
// arqDados.write(texto);
// arqDados.newLine();
arqDados.println(texto);
arqDados.close();
arqGrava.close();*/
return null;
}
catch(Exception e){
return e.getMessage();
}
}
public String ler(){
String texto = "";
String conteudo="";
try{
reader = new FileReader(arquivo);
bufferReader = new BufferedReader(reader);
while (bufferReader.ready()) {
//Ler linha por linha
System.out.println(bufferReader.readLine());
}
/*
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while((conteudo=br.readLine())!=null){
texto = br.readLine();
}
br.close();
arqLe.close();
*/
}catch(Exception e){
e.getMessage();
}
return null;
}
/**
*
* @return
*/
public boolean exists() {
throw new UnsupportedOperationException("Not yet implemented");
}
boolean isFile() {
throw new UnsupportedOperationException("Not yet implemented");
}
}
mbastos73 agora falta vc modelar a solução.
1 - No momento de gravar vc tem que ler o dados já contidos no arquivo, juntar com a nova entrada e gravar novamente.
2 - No momento de ler vc pode implementar um arraylist para carregar todas as saídas do arquivos e carregar o Jlist.
3 - Para excluir vc deve pesquisar no arquivo e excluir a linha correspondente.
Dá uma olhada e fala ai!
Esse Arraylist tenho que dar uma pesquisada, não me lembro. Tentei criar um Array de String (String[] texto), mas não deu.
Tentei um for no combobox para ler cada um dos indices do Array, mas não sei como passar o índice do array do metodo ler (classe Arquivo) para o Action do combo.
mbastos73 o Arraylist seria para vc pegar todas as linhas do arquivo e alimentar o Jlist.
O for vc tem que utilizar para passar a seguinte instrução:
Mas é claro vc tem que dar uma alterada nesta implementação.
Fiz um arraylist (ArrayListtexto). Adicionar os elementos em lismodel está igual ao da sua última mensagem; mas para fazer o for, tenho de ter um indice de tamanho, ou usar um while, mas e como interromper?
Não consegui. Não consigo fazer aparecer cada cidade em uma linha, mesmo com o arraylist. Tentei um for, pegando o size da arraylist, mas não deu certo. Vou tentando.
Mas mesmo assim, muito obrigado por sua dedicação. Como disse, vou tentando. Se tiver mais alguma idéia, estou no aguardo.
VALEU MESMO!
.
mbastos73 dá uma olhada neste código:
Ler e gravar arquivos:public String gravar(String texto){
try{
//Criar arquivo se não existir
arquivo.createNewFile();
write = new FileWriter(arquivo);
bufferWrite = new BufferedWriter(write);
//adicionando texto ao arquivo
bufferWrite.write(texto);
bufferWrite.newLine();
bufferWrite.close();
/*
FileWriter arqGrava=new FileWriter(this.nomeArquivo,false);
PrintWriter arqDados=new PrintWriter(arqGrava);
//BufferedWriter arqDados=new BufferedWriter(arqGrava);
// arqDados.write(texto);
// arqDados.newLine();
arqDados.println(texto);
arqDados.close();
arqGrava.close();*/
return null;
}
catch(Exception e){
return e.getMessage();
}
}
public ArrayList<String> ler(){
String texto = "";
String conteudo="";
try{
reader = new FileReader(arquivo);
bufferReader = new BufferedReader(reader);
while (bufferReader.ready()) {
array.add(bufferReader.readLine());
}
bufferReader.close();
/*
FileReader arqLe=new FileReader(this.nomeArquivo);
BufferedReader br=new BufferedReader(arqLe);
while((conteudo=br.readLine())!=null){
texto = br.readLine();
}
br.close();
arqLe.close();
*/
}catch(Exception e){
e.getMessage();
}
return array;
}
private void jCBxEstadosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCBxEstadosActionPerformed
jList1.setModel(lstModel);
lstModel.clear();
a=new Arquivo((String)jCBxEstados.getSelectedItem()+".txt");
textos = a.ler();
for (int i = 0; i < textos.size(); i++) {
lstModel.addElement(textos.get(i));
}
jList1.setModel(lstModel);
}//GEN-LAST:event_jCBxEstadosActionPerformed
Os métodos gravar, ler e listar estão funcionando bacana.
Ficando assim necessário fazer alguns implementações, pois o add deve aceitar várias entradas e ao gravar vc deve manter o que já existe no arquivo. E o excluir está bagunçando o arquivo, desta forma dá uma arrumada nele, o método para listar pode te ajudar.
Com sua imaginação e os códigos acima é possível vc desenrolar isso ai.
Qualquer coisa dá um grito!
Urbgames, perfeito!!! Fiz algumas alterações, para deixar mais do jeito que havia escrito desde o início. Mas eu cheguei a fazer uma arraylist, mas devo ter feito alguma bobagem, no add os elementos talvez (eu apaguei o código que fiz com o arraylist, mas acho que não tinha implementado uma arraylist no combobox). Lógico que não iria funcionar, mas só vi isto agora.
MAS MUITO OBRIGADO POR TEU EMPENHO (e a caixa alta é para gritar mesmo). Faz mais de uma semana que estou às voltas com isto.
CARA, MAIS UMA VEZ MUITO OBRIGADO, e ao forum GUJ de uma forma geral. Vou ficar de olho no forum, pois vi que a comunidade é muito importante em nosso desenvolvimento. Se puder ajudar com meu modesto conhecimento, ficarei feliz.
PS: como vcs fazem para inserir o código da maneira elegante que apareceram os teus?? (preguiça de ler a respeito das postagens!!!)
mbastos73 para vc inserir linhas de códigos aq no fórum basta utilizar a tag CODE, encontra-se no grupo "Corpo da mensagem".
Exemplo.:
[code]
//Código aqui
[/code*]
Claro, tira o asterisco!!
Legal que tenha conseguido, e muito interessante vc ter deixado o código original. É necessário que vc consiga fazer sua própria implementação, tendo apenas como apoio os códigos que por aqui apareçam.
É bom poder sempre contar com novos provedores de conhecimento. Seja bem-vindo!