Olá pessoal. Estou desenvolvendo uma aplicação simples em java.
Ela consiste em 5 JTextPane, cada um para uma secção da informação completa.
Ao salvar o qruivo TXT, há uma quebra de linha no final de cada paragrafo(\n), num mesmo arquivo.
Agora a questão:
Preciso que, ao abrir esse mesmo arquivo, a aplicação saiba dividir cada paragrafo para sua devida TextArea novamente. Creio que pra isso os \n devam ser localizados, mas não faço muita ideia de como fazer isso.
Sou principiante em java.
Alguem pode me dar uma sugestão?
Obrigado a todos.
Como você está lendo seu arquivo? Com Scanner?
No exemplo que te passei no outro tópico, o scanner lia o arquivo linha-a-linha.
A minha classe lara salvar/ler arquivo é a seguinte:
import java.awt.*;
import java.io.*;
import javax.swing.JFrame;
public class ArquivoTXT extends JFrame {
FileDialog fAbrir = new FileDialog(this,"Abrir arquivo",FileDialog.LOAD);;
FileDialog fSalvar= new FileDialog(this,"Salvar arquivo",FileDialog.SAVE);;
ArquivoTXT() {
}
public void salvarTXT (String texto) {
String nomeDoArquivo;
try {
fSalvar.setVisible(true);
if (fSalvar.getFile()==null) return;
nomeDoArquivo = fSalvar.getDirectory()+fSalvar.getFile() + ".txt";
FileWriter out = new FileWriter(nomeDoArquivo);
out.write(texto);
out.close();
}
catch(java.io.IOException exc) {
System.out.println(exc);
}
}
public String letTXT(){
String nomeDoArquivo;
try {
fAbrir.setVisible(true);
if (fAbrir.getFile()==null) return null;
nomeDoArquivo = fAbrir.getDirectory()+fAbrir.getFile();
FileReader in = new FileReader(nomeDoArquivo);
String S="";
int i = in.read();
while (i!=-1) {
S = S +(char)i;
i = in.read();
}
in.close();
return S;
}
catch(java.io.IOException exc) {
System.out.println(exc);
return null;
}
}
}
Não fui eu que criei essa classe. Eu peguei um exemplo na internet e fiz algumas modificações apenas.
Ainda não entendo certas coisas dessa casse.
Aqui no GUJ tem um tutorial explicando a manipular arquivos
http://guj.com.br/article.show.logic?id=13
Por que não usa a classe que te passei? Faz a mesma coisa, mas de maneira mais segura.
E já separa o texto linha-a-linha! Olhe lá o método scan.next(). Cada chamada dele lê uma linha inteira do texto.
Você pode até adaptar o método Ler dela para retornar uma List<String> onde o elemento 0 será a primeira linha, o 1 a segunda, etc:
public List<String> ler() {
//Mesmo esquema do método acima, mas agora usamos a caixa de abrir arquivo.
if (fileChooser.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) {
return new ArrayList<String>();
}
File file = fileChooser.getSelectedFile();
//Criamos a lista que conterá as linhas lidas do arquivo.
List<String> linhas = new ArrayList<String>();
//Criamos um scanner, para ler do arquivo.
Scanner scan = null;
try {
scan = new Scanner(file);
//Enquanto o arquivo tiver linhas
while (scan.hasNextLine()) {
//Lemos a linha
linhas.add(scan.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//Fechamos o arquivo
if (scan != null) {
scan.close();
}
}
//Retornamos o texto lido.
return linhas;
}
segue outra forma de leitura e separação em linhas:
ArrayList<String> arrStr = new ArrayList<String>();
try {
FileReader fr;
fr = new FileReader("caminho/do/arquivo");
BufferedReader br = new BufferedReader(fr);
String linha = br.readLine();
while (linha != null) {
arrStr.add(linha);
linha = br.readLine();
}
br.close();
return;
} catch (FileNotFoundException e1) {
System.out.println("Aviso: não achou o arquivo"+path);
e1.printStackTrace();
return;
} catch (IOException e) {
System.out.println("Aviso: erro de e/s"+path);
e.printStackTrace();
return;
} catch(Exception e){
System.out.println("erro para o arquivo:"+path);
e.printStackTrace();
return;
}
[quote=ViniGodoy]Você pode até adaptar o método Ler dela para retornar uma List<String> onde o elemento 0 será a primeira linha, o 1 a segunda, etc:
[code]
public List ler() {
//Mesmo esquema do método acima, mas agora usamos a caixa de abrir arquivo.
if (fileChooser.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) {
return “”;
}
File file = fileChooser.getSelectedFile();
//Criamos a lista que conterá as linhas lidas do arquivo.
List<String> linhas = new ArrayList<String>();
//Criamos um scanner, para ler do arquivo.
Scanner scan = null;
try {
scan = new Scanner(file);
//Enquanto o arquivo tiver linhas
while (scan.hasNextLine()) {
//Lemos a linha
linhas.add(scan.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//Fechamos o arquivo
if (scan != null) {
scan.close();
}
}
//Retornamos o texto lido.
return linhas;
}
[/code][/quote]
Só faltou um detalhe: agora o método retorna um List. Então se o usuário cancelar não pode retornar uma String vazia (deveria retornar um List vazio).
Bem observado, Marco, já corrigi lá em cima.
Na verdade, o ideal mesmo é passar o nome do arquivo via parâmetro, e fazer a leitura fora do método. Assim vc também poderá chama-lo caso o nome do arquivo não seja por uma caixinha (por exemplo, se você quiser criar a lista de “arquivos recentes”).
[quote=ViniGodoy]Você pode até adaptar o método Ler dela para retornar uma List<String> onde o elemento 0 será a primeira linha, o 1 a segunda, etc:
[code]
public List ler() {
//Mesmo esquema do método acima, mas agora usamos a caixa de abrir arquivo.
if (fileChooser.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) {
return new ArrayList();
}
File file = fileChooser.getSelectedFile();
//Criamos a lista que conterá as linhas lidas do arquivo.
List<String> linhas = new ArrayList<String>();
//Criamos um scanner, para ler do arquivo.
Scanner scan = null;
try {
scan = new Scanner(file);
//Enquanto o arquivo tiver linhas
while (scan.hasNextLine()) {
//Lemos a linha
linhas.add(scan.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//Fechamos o arquivo
if (scan != null) {
scan.close();
}
}
//Retornamos o texto lido.
return linhas;
}
[/code][/quote]
Obriado pelo método. Já estou utilizando a classe que me mandou ontem, e vou adicionar esse novo método e aprender a mecher com essas tais de lists.
Valeu.
[quote=ViniGodoy]Para ver como usar a lista, dá uma olhada:
http://www.guj.com.br/posts/list/74068.java#389435[/quote]
Obrigado pelos exemplos concretos e pelas sugestões, Vini. Realmente Aprendi um bocado com todos, e já está entrando na minha cabeça essa logida de leitura de arquivo.
Agora me sugiu mais um desafio: a aplicação possui 5 JTextFields, e eu a fiz prezumindo que não haverá quebra de linha em cada uma delas. Se houver, a lista de leitura terá mais do que 5 elementos, e alguma informação ficará de fora. Mas isso já tenho ideia de como resolver.
Também preciso aprender como atualizar um arquivo (Faço pela metade agora, salvo, fecho. Volto, abro, e continuo de onde parei, termino e salvo no mesmo arquivo). Pra isso é só usar o endereço do arquivo e gravar por cima dele mesmo, não é? .
Mais algumas horas de pesquisa xD Em casa continuo.
Obrigado a todos pela ajuda, e por não me criticarem como já vi muitos fazendo.
Quando a aplicação estiver pronta, eu posto ela aqui.
Ola mais uma vez, bom dia a todos.
Vini, agora estou utilizando a classe que me mandou como padrão, mas não consigo salvar os arquivos automaticamente como .txt
Na classe que eu usava antes, foi preciso apenas adicionar um +".txt" no nome do arquivo. Ao ser salvo, a extenção estaria pronta (antes salvava sem extenção alguma). Isso porque, pelo que eu entendi, a classe FileDialog retorna uma String.
String nomeDoArquivo = fSalvar.getDirectory()+fSalvar.getFile() + ".txt";
Já a classe JFileChooser retorna um File, e não consegui adicionar a extenção .txt no final:
File file = fileChooser.getSelectedFile();
O que posso fazer pra que a classe JFileChooser salve o arquivo já com a extenção .txt ?
Obrigado.
Exatamente isso que você disse. Para acessar o caminho de um objeto File, use a propriedade getPath() - essa sim retorna uma String.
E antes de adicionar a extensão, veja se o arquivo já não termina com ‘.txt’ (procure sobre endsWith() da classe String). Isso evita arquivos como ‘texto.txt.txt’.
oO o que acontece aqui?
Todos os indexOf() tao retornando -1
List<String> texto = arquivo.ler();
int indiceTwitter = texto.indexOf("Twitter");
int indiceBlog = texto.indexOf("Blog");
int indiceNoticia_Cliente = texto.indexOf("Noticia_Cliente");
int indiceNoticia_IOB = texto.indexOf("Noticia_IOB");
int indiceDestaque = texto.indexOf("Destaque");
//System.out.println(texto);
System.out.println(indiceTwitter);
System.out.println(indiceBlog);
System.out.println(indiceNoticia_Cliente);
System.out.println(indiceNoticia_IOB);
System.out.println(indiceDestaque);
a saida é:
-1
-1
-1
-1
-1
O que pode estar acontecendo? Preciso desses index para preencher os campos novamente, ao abrir o arquivo.
Faça assim e coloque a saída aqui depois:
for (String s : arquivo.ler()) {
System.out.println(s);
}
[quote=marcobiscaro2112]Faça assim e coloque a saída aqui depois:
for (String s : arquivo.ler()) {
System.out.println(s);
}
[/quote]
Obrigado pela ajuda, marco, mas eu não entendi pra que serve esse laço. Pelo que vi, ele pega o arquivo e poe nessa String s, apenas.
Mas como isso me ajuda a descobrir as posições na List texto ?
Eis a minha intenção:
[code] List texto = arquivo.ler();
String text="";
int x;
for (String s : arquivo.ler()) {
System.out.println(s);
}
int indiceTwitter = texto.indexOf("Twitter");
int indiceBlog = texto.indexOf("Blog");
int indiceNoticia_Cliente = texto.indexOf("Noticia_Cliente");
int indiceNoticia_IOB = texto.indexOf("Noticia_IOB");
int indiceDestaque = texto.indexOf("Destaque");
//System.out.println(texto);
System.out.println(indiceTwitter);
System.out.println(indiceBlog);
System.out.println(indiceNoticia_Cliente);
System.out.println(indiceNoticia_IOB);
System.out.println(indiceDestaque);
for (x=indiceTwitter; x < texto.indexOf("Blog"); x++)
text+=texto.get(x);
texto_twitter.setText(text);
text="";
for (x=indiceBlog; x<indiceNoticia_Cliente; x++)
text+=texto.get(x);
texto_blog.setText(text);
text="";
for (x=indiceNoticia_Cliente; x<indiceNoticia_IOB; x++)
text+=texto.get(x);
texto_noticia.setText(text);
text="";
for (x=indiceNoticia_IOB; x<indiceDestaque; x++)
text+=texto.get(x);
texto_noticia2.setText(text);
text="";
for (x=indiceDestaque; x<texto.size(); x++)
text+=texto.get(x);
texto_destaque.setText(text);[/code]
Só que todos os indexOf estão retornando -1, o que me dá um erro java.lang.ArrayIndexOutOfBoundsException quando tento executar.
Você executou o código que te passei? Qual foi a saída?
Executei sim. A saida foi o arquivo txt que eu abri.