Problemas em sobescrever arquivos

8 respostas
vtr88

A intenção do método era de ler linha por linha do arquvio externo comparando com a string recebida e no lugar dela usar o teste1.write pra sobescrever.

public void remover(String nome) throws IOException { FileReader reader = new FileReader(arquivo); BufferedReader leitor = new BufferedReader(reader); DataOutputStream teste1 = new DataOutputStream(new FileOutputStream(arquivo, false)); String delete = " "; while (nome.equalsIgnoreCase((leitor.readLine().toString()).substring(5, 7))) teste1.write(delete.getBytes()); reader.close(); leitor.close(); teste1.close(); }

Não consegui ainda ver se o teste1.write vai sobescrever corretamente por que está dando um erro de:

Exception in thread main java.lang.NullPointerException

at Banco.EscreverLer.remover(EscreverLer.java:89)

at Banco.Banco.main(Banco.java:20)

Não sei como fazer a comparação corretamente nem se o write vai sobescrever só na linha.
Alguma dica?

8 Respostas

nel

O erro indica que há uma referência nula tomando alguma ação.
Analise a linha exata (89) que esse erro ocorre e veja o motivo disso. Outro detalhe, o método readLine() já lhe retorna uma String, totalmente desnecessário o toString() nele.

A String “nome” não está indo nula hein?

vtr88

nel, muito obrigado pela atenção e as dicas…

a linha 89 em questão é essa mesmo:

while (nome.equalsIgnoreCase((leitor.readLine().toString()).substring(5, 7)))

o problema não é o toString() por que sem ele esta dando o mesmo erro e sobre o a variavel nome eu estou sim passando uma string dessa forma “Marcela” no parametro… :\

ViniGodoy

O nel não falou que o problema era o toString(). Ele falou que aquele toString() é um comando inútil. Não tem porque deixa-lo dando a impressão do que seu código é mais complexo do que realmente é.

A forma mais fácil de achar um NullPointerException é com o depurador. Ponha um breakpoint na linha 89, rode o programa, e inspecione os valores das variáveis para descobrir qual delas vale null.

vtr88

o nullpointerex ocorre no leitor.readLine().substring(5, 7) e eu imaginei que fosse por que o leitor.readline não retornava uma string propriamente e por isso coloquei o to string, mas mesmo não funcionou.

eu acho que o que não ta funcionando é o leitor.readline, ele parece estar sempre null, mesmo com o arquivo com textos nas linhas…

apesar de não entrar direito no debug do metodo, ele sempre limpa o arquivo todo depois de rodar, mesmo dando a exception

drsmachado

vtr88:

o breakpoint do eclipse inclusive não esta normal, quando eu coloco ele dentro do metodo ele fica quebrado, a bolinha com um corte no meio, nunca tinha visto isso…

Na perspectiva Debug, do eclipse, acesse a aba breakpoints.
Nesta aba existe um botão que ao passar o cursor do mouse sobre ele apresenta o tooltip “skip all breakpoints”. Ele deve estar habilitado.
Desabilite-o e o breakpoint estará ativo novamente (aliás, todos os breakpoints).

vtr88

obrigado drsmachado, depois de fazer o que você disse eu testei tirar o leitor pra fora do while pra ver:

public void remover(String nome) throws IOException { FileReader reader = new FileReader(arquivo); BufferedReader leitor = new BufferedReader(reader); DataOutputStream teste1 = new DataOutputStream(new FileOutputStream(arquivo, false)); String delete = " "; leitor.readLine();

quando ele chega no leitor ele pega null por que alguma coisa entre a declaração do reader ali e ele o arquivo todo esta sendo apagado… seria o dataoutputstream?
tem algum outro jeito de sobescrever sem ser com o fileoutputstream??

vtr88

Só pra constar para quem acompanhou a discussão aqui, quando eu declaro o FileOutputStream e coloco no segundo paramêtro o false, que indica que eu quero sobescrever e não fazer o append ele apaga o arquivo todo pra começar a escrever do zero.
Por isso o leitor estava pegando nulo.
Continuo na busca ou mesmo em alguma forma de sobescrever para “remover” corretamente.

E

Se você precisa de ler e escrever simultaneamente no mesmo arquivo, só há uma solução em Java, que é o uso de RandomAccessFile.

Criado 9 de maio de 2012
Ultima resposta 9 de mai. de 2012
Respostas 8
Participantes 5