1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como alterar uma linha de um conteúdo .txt usado IO (Java)? part. 2

Eu criei uma classe chamada Questao, ela tem os seguintes atributos. String pergunta, String resposta, String respostaErrada1, String respostaErrada2 e tem seus respectivos getters e setters.

E estas perguntas estão armazenadas em um arquivo .txt na seguinte ordem, só que uma palavra embaixo da outra:

Pergunta
Resposta
RespostaErrada1
RespostaErrada2
Pergunta
Resposta
RespostaErrada1
RespostaErrada2
Etc...

Até 20.

E eu preciso fazer um método que localize a pergunta desejada, e altere a pergunta, resposta, respostaErrada1 e respostaErrada2, que ficam uma embaixo do outro.

Com a ajuda de um usuario do site pude fazer este método:

public static void alteraLinha(String perguntaAntiga, Questao novaQuestao) {
        String arquivo = "Perguntas.txt";
        //Crio um arquivo temporário
        String arquivoTmp = "ArquivoTemporario.txt";
        String palavraNova = novaQuestao.getPergunta();

        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(arquivoTmp));
            BufferedReader reader = new BufferedReader(new FileReader(arquivo));

            String linha;
            String minhaLinha;
            //Se a linha não for nula, ele continua
            while ((linha = reader.readLine()) != null) {
                if (linha.contains(perguntaAntiga)) {
                    writer.write(novaQuestao.getPergunta() + "\n");
                    writer.write(novaQuestao.getRespostaCorreta() + "\n");
                    writer.write(novaQuestao.getRespostaErrada1() + "\n");
                    writer.write(novaQuestao.getRespostaErrada2() + "\n");
                } else {
                    writer.write(linha + "\n");
                }
            }

            writer.close();
            reader.close();

            new File(arquivo).delete();
            new File(arquivoTmp).renameTo(new File(arquivo));

        } catch (IOException e) {
            System.out.println("Erro: " + e);
        }
    }

Só que está ocorrendo um problema, quando eu vou usar o método para substituir a pergunta, algumas vezes ele faz errado.

Ex: Ele altera duas perguntas, coloca a resposta de uma pergunta com pergunta de outra.

Ou seja, ele da uma bagunçada, como eu resolvo isso?

Obs. Ele funciona quase perfeitamente, só que as vezes ele embaralha um pouco algumas linhas.

  • Você poderia colocar um exemplo (entrada, saída errada e saída esperada) no qual o programa falha?

    Felipe   27 de mai de 2013
  • Acontece assim: tenho 20 perguntas em um txt, sendo que na primeira linha tem um pergutna, na linha de baixo a reposta correta, na de baixo uma resposta errada e na de baixo outro errada. É como se fosse um banco de dados, com uma sequencia de 4 linhas para cada Questao. Estou usando Swing junto. Quanto eu vou alterar o txt recupero o texto da pergunta e envio tanto o texto da pergunta a ser alterada, assim como a nova pergunta, que foi digitada na tela. Quando eu vejo o txt, ex: Quando eu altero a primeira pergunta, ele diminue uma linha do txt, ou seja ele tinha 84 linhas e depois...

    Douglas   27 de mai de 2013
  • fica com 83 linhas, ou eu vou alterar a ultima pergunta e ele altera na penultima.

    O resultado disso é, que se ele muda uma das linhas de ordem, ele embaralha tudo, pois está dividido da forma que eu exliquei. A cada quatro linhas tem todas as Strings que formam uma Questao

    Douglas   27 de mai de 2013
  • Você consegue fazer um exemplo onde esse problema aconteça e complementar a sua pergunta?

    Felipe   27 de mai de 2013
  • Eu imagino que o problema está no for interagindo com a escrita do arquivo.

    Pois a idéia é assim: Quando ele achar a pergunta que deve mudar, ele muda a pergunta e as 3 linhas de baixo. Totalizando a mudança de 4 linhas.

    As outras não devem ser alteradas

    Douglas   27 de mai de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags io java ou faça a sua própria pergunta.