Seguinte fiz um codigo apra ler um arquivo txt, e gravar alguns dados simples, estou fazendo alguns testes, e no arquivo não grava mais de um registro, ele sobrescreve o antigo, ficando como novo, tbm gostaria de saber como fazer pro programa criar o arquivo, caso ele não exista, se existir naum faz nd, segue o codigo abaixo.
import java.io.*;
import javax.swing.JOptionPane;
public class ManipulandoArquivos {
public ManipulandoArquivos(){
}
public void NovaGrav( String name, String Sobrenome, int nReg, String RG ) throws IOException{
try{
File arqui = new File( "cadastro.txt" );
FileOutputStream fos = new FileOutputStream(arqui);
String aux;
aux = "\n" + nReg + " ";
fos.write( aux.getBytes() );
aux = "\n" + name + " ";
fos.write( aux.getBytes() );
aux = "\n" + Sobrenome + " ";
fos.write( aux.getBytes() );
aux = "\n" + RG + " " + "\n";
fos.write( aux.getBytes() );
fos.close();
}catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
public String LeArquivo() throws IOException{
StringBuilder sb = new StringBuilder();
try{
File arqui = new File( "cadastro.txt" );
FileInputStream fis = new FileInputStream(arqui);
int ln;
while( (ln = fis.read()) != -1 ){
sb.append( (char)ln );
if( (char)ln == ' ' ){
sb.append( "\n" );
}
}
}catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog( null, ex.getMessage() + "", "ERRO", JOptionPane.ERROR_MESSAGE );
System.exit(0);
}
return sb.toString();
}
}
Uma dica que irei lhe dar. Se for gravar arquivos textos não binários, utilize o BufferedWriter.
Dessa forma fazemos o seguinte…
Criamos um arquivo pela classe File, depois atribuímos esse objeto a um BufferedWriter do qual iremos evocar toda vez o método write do mesmo para gravar. Não se esqueça de colocar “\n” ou “\r\n” a depender do SO para pular a linha.
Depois é só fechar o canal chamando o método close e pronto.
eu quero inserir novos cadastros e o programa inseri sempre um em cima do outro, isso que eu gostaria de corrigir, pensei em adicionar um ] no final do txt para qdo o programa encontrar algum ele inserir em baixo, só não sei como fazer
Sua lógica está mais complexa e desnecessária, não precisa de forma alguma inserir um “]” para que ele substitua por um linha para pular, apenas adicione o que eu falei antes, você precisa saber que para pular linha segue da forma dos caracteres especiais como “\n” ou “\r\n”, da mesma forma que ocorre no C/C++.
Tente fazer o código da forma como falei, assim você irá estimular a sua lógica e raciocínio e então poderei lhe ajudar tirando suas dúvidas em cima do código.
eu substitui os fos e fis por BufferedWriter e BufferedReader, mas no txt fica a msm coisa, eu so gostaria de saber como faço para naum ficar sobreescrevendo as dados que já tenho, se tem algum meio?
vou postar como ficou meu codigo
import java.io.*;
import javax.swing.JOptionPane;
public class ManipulandoArquivos {
public ManipulandoArquivos(){
}
//Insere uma nova gração no arquivo de texto
public void NovaGrav( String name, String Sobrenome, int nReg, String RG ) throws IOException{
try{
//abre o arquivo
File arqui = new File( "cadastro.txt" );
//adiciona o arquivo para ser escrito
BufferedWriter bw = new BufferedWriter( new FileWriter( arqui ) ) ;
String aux;
aux = "\nNumero: " + nReg + " ";
bw.write( aux ); //escreve no arquivo
aux = "\nNome: " + name + " ";
bw.write( aux );
aux = "\nSobrenome: " + Sobrenome + " ";
bw.write( aux );
aux = "\nRG: " + RG + " " + "]";
bw.write( aux );
bw.close();//fecha arquivo de escrita
}catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
//Le o arquivo
public String LeArquivo() throws IOException{
//StringBuilder para formar uma string para exibir na tela os cadastros
StringBuilder sb = new StringBuilder();
try{
//define qual é o arquivo
File arqui = new File( "cadastro.txt" );
//adiciona o arquivo para ser lido
BufferedReader br = new BufferedReader( new FileReader( arqui ) ) ;
int ln;//declara uma linha
while( (ln = br.read()) != -1 ){
//verifica enqto a linha naum for = -1
if( (char)ln == ']' ){//se o caracter da linha for = a ]
sb.append( "\n" );//pula uma linha
}else{//senaum
sb.append( (char)ln );//adiciona o caracter
}
}
}catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog( null, ex.getMessage() + "", "ERRO", JOptionPane.ERROR_MESSAGE );
System.exit(0);
}
return sb.toString();//retorna string formada
}
}
Veja o código abaixo, irei comentá-lo logo em seguida…
Você fez de forma parecida com esse, não entanto quando utilizo “\r\n” para pular a linha, criei apenas uma referência para dois objetos do tipo String, no primeiro ele atribui o valor “ET” escreve no buffer do arquivo, e então perde essa String, depois a referência aponta para outra String com o valor de “Minha casa” antecedido pelo retorno e pulagem de linha.
Dou um flush no final e fecho a conexão do BufferedWriter, então ele criou um arquivo de texto do qual não tem valores substituidos