Problema ao limpar arquivo TXT! [RESOLVIDO]

2 respostas
C

Depois que coloquei um método para limpar todo o txt, meu programa sempre manda um erro de Stream Closed!!!
O que é isso?
Como arrumo?

Método para limpar:

//Deleta todos os registros do File requerido
    //[ERRO] Toda vez que o arquivo vai ser escrito ou lido, obtem erro Stream closed
    public static void deletarTodosRegistros(File registros)throws FileNotFoundException, IOException {
        Writer clean = new BufferedWriter(new FileWriter(registros));
        clean.close();
    }

Usei o FileWriter que apaga tudo que tem no arquivo, menos quando for > FileWriter(file, true);

Todo o programa:

import java.io.*;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

    static BufferedReader ler;
    static Writer registrar;

    //Metodo de adicionar novo registro - Requer File a ser gravado, int ID, String nome e double saldo
    public static void addRegistro(File registros, int id, String nome, double saldo) throws IOException {
        registrar.write(id+"#"+nome+"#"+saldo+"\n");
        registrar.close();
    }

    //Metodo que mostra todos os registros - Requer File a ser lido
    public static void lerRegistro(File registros) throws IOException {
        String registro = null;
        while((registro = ler.readLine()) != null) {
            System.out.println(retirarMarcadores(registro));
        }
        ler.close();
    }

    //Conta quantos registros existem no File requerido - [ERRO!] Esta contando as linhas e não o número de registros
    public static int contar(File registros) throws FileNotFoundException, IOException {
        int quantidade = 0;
        while(ler.readLine() != null) {
            quantidade++;
        }
        return quantidade;
    }

    //Retorna true ou false caso encontra o int ID no File requerido
    //Boolean mostrarConsole permite que mostre o registro completo caso exista o ID
    public static boolean procurarId(File registros, int id, boolean mostrarConsole) throws FileNotFoundException, IOException {
        String registro = null;
        boolean encontrado = false;
        while((registro = ler.readLine()) != null) {
            if(separarID(registro) == id) {
                if(mostrarConsole) System.out.println(retirarMarcadores(registro));
                encontrado = true;
            }
        }
        ler.close();
        return encontrado;
    }

    //Retorna true ou false caso encontra a String nome no File requerido
    //Boolean mostrarConsole permite que mostre o registro completo caso exista o nome
    public static boolean procurarNome(File registros, String nome, boolean mostrarConsole) throws FileNotFoundException, IOException {
        String registro = null;
        boolean encontrado = false;
        while((registro = ler.readLine()) != null) {
            if(separarNome(registro).equalsIgnoreCase(nome)) {
                if(mostrarConsole) System.out.println(retirarMarcadores(registro));
                registro = null;
                encontrado = true;
            }
        }
        ler.close();
        return encontrado;
    }

    //Retorna true ou false caso encontra o double saldo no File requerido
    //Boolean mostrarConsole permite que mostre o registro completo caso exista o saldo
    public static boolean procurarSaldo(File registros, double saldo, boolean mostrarConsole) throws FileNotFoundException, IOException {
        String registro = null;
        boolean encontrado = false;
        while((registro = ler.readLine()) != null) {
            if(separarSaldo(registro) == saldo) {
                if(mostrarConsole) System.out.println(retirarMarcadores(registro));
                encontrado = true;
            }
        }
        ler.close();
        return encontrado;
    }

    //Retorna somente o ID de uma linha de registro
    public static int separarID(String registroCompleto) {
        int primeiroMarcador = 0;
        for(int i = 0; i < registroCompleto.length(); i++) {
            if(registroCompleto.charAt(i) == '#') {
                primeiroMarcador = i;
                return Integer.parseInt(registroCompleto.substring(0, primeiroMarcador));
            }
        }
        return 0;
    }

    //Retorna somente o nome de uma linha de registro
    public static String separarNome(String registroCompleto) {
        int marcadores[] = new int[2];
        int j = 0;
        for(int i = 0; i < registroCompleto.length(); i++) {
            if(registroCompleto.charAt(i) == '#') {
                marcadores[j] = i;
                j++;
                if(j == 2) {
                    return registroCompleto.substring(marcadores[0]+1, marcadores[1]);
                }
            }
        }
        return null;
    }

    //Retorna somente o saldo de uma linha de registro
    public static double separarSaldo(String registroCompleto) {
        int segundoMarcador = 0;
        for(int i = 0; i < registroCompleto.length(); i++) {
            if(registroCompleto.charAt(i) == '#') {
                segundoMarcador = i;
            }
        }
        if(segundoMarcador != 0) {
            return Double.parseDouble(registroCompleto.substring(segundoMarcador+1, registroCompleto.length()));
        }
        return 0;
    }

    //Retorna o registro inteiro sem os marcadores separando as informações da linha
    public static String retirarMarcadores(String registroCompleto) {
        return separarID(registroCompleto)+" - "+separarNome(registroCompleto)+" - "+separarSaldo(registroCompleto);
    }

    //Retorna uma array int com todos os IDs do File
    public static int[] colocarIdArray(File registros) throws FileNotFoundException, IOException {
        int[] todosIds = new int[contar(registros)];
        String tempRegistro;
        for(int i = 0; (tempRegistro = ler.readLine()) != null; i++) {
            todosIds[i] = separarID(tempRegistro);
        }
        return todosIds;
    }

    //Retorna uma array String com todos os nomes do File
    public static String[] colocarNomeArray(File registros) throws FileNotFoundException, IOException {
        String[] todosNomes = new String[contar(registros)];
        String tempRegistro;
        for(int i = 0; (tempRegistro = ler.readLine()) != null; i++) {
            todosNomes[i] = separarNome(tempRegistro);
        }
        return todosNomes;
    }

    //Retorna uma array double com todos os saldos do File
    public static double[] colocarSaldoArray(File registros) throws FileNotFoundException, IOException {
        double[] todosSaldos = new double[contar(registros)];
        String tempRegistro;
        for(int i = 0; (tempRegistro = ler.readLine()) != null; i++) {
            todosSaldos[i] = separarSaldo(tempRegistro);
        }
        return todosSaldos;
    }

    //Deleta todos os registros do File requerido
    //[ERRO] Toda vez que o arquivo vai ser escrito ou lido, obtem erro Stream closed
    public static void deletarTodosRegistros(File registros)throws FileNotFoundException, IOException {
        Writer clean = new BufferedWriter(new FileWriter(registros));
        clean.close();
    }

    //Main
    public static void main(String[] args) throws IOException {

        File registros = new File("registros.txt");
        ler = new BufferedReader(new FileReader(registros));
        registrar = new BufferedWriter(new FileWriter(registros, true));
        Scanner s = new Scanner(System.in);

        //Menu no console
        int escolha = 1;
        while(escolha != 0) {
            System.out.println("Escolha:\n" +
                    "(1)Adicionar Registro\n" +
                    "(2)Ler Registros("+contar(registros)+")\n" +
                    "(3)Procurar por ID\n" +
                    "(4)Procurar por Nome\n" +
                    "(5)Procurar por Saldo\n" +
                    "(6)Deletar todos os registros\n" +
                    "(0)Sair");
            try {
                escolha = s.nextInt();
            }

            //Impede que o usuário digite uma letra
            catch(InputMismatchException e) {
                System.out.println("Valor inválido. Digite um número.");
                escolha = -1;
            }

            switch(escolha) {

                //Adicionando novo registro
                case 1:
                    System.out.println("Digite: Nome (enter) Saldo:");
                    {
                        int id;
                        String nome = null;
                        double saldo;
                        try {
                            id = 1;
                            while(procurarId(registros, id, false)) {
                                id++;
                            }
                            boolean erroDeCaracter = false;

                            //Impede que o usuário use # no nome
                            //# é usado para separar as informações no txt
                            do {
                                if(erroDeCaracter) System.out.println("O nome não pode conter #");
                                erroDeCaracter = false;

                                //Impede que o nome seja vazio
                                do {
                                    nome = s.nextLine();
                                } while(nome.length() == 0 || nome.equals(null));

                                erroDeCaracter = true;
                            } while(nome.contains("#"));

                            saldo = s.nextDouble();
                            addRegistro(registros, id, nome, saldo);
                        }

                        //Impede que o usuário digite uma letra para o saldo
                        catch(InputMismatchException e) {
                            System.out.println("Erro! Valor inválido. Digite um número para saldo.");
                            System.exit(1);
                        }
               }
                    break;

                    //Ler todos os registros
                case 2:
                    lerRegistro(registros);
                    break;

                    //Procura um registro pelo ID e mostra no console
                case 3:
                        int id;
                        try {
                            id = s.nextInt();
                            procurarId(registros, id, true);
                        }

                        //Impede que o usuário digite uma letra
                        catch(InputMismatchException e) {
                            System.out.println("Erro! Valor inválido. Digite um número para ID.");
                            //[ERRO] Entra em loop infinito mostrando o texto do menu de opções
                            //Termina o programa para não ocorrer o erro!
                            System.exit(1);
                        }
                    break;

                    //Procura um registro pelo nome e mostra no console
                case 4:
                        String nome = null;

                        //Impede que o nome seja vazio
                        do {
                            nome = s.nextLine();
                        } while(nome.length() == 0 || nome.equals(null));
                        procurarNome(registros, nome, true);
                    break;

                    //Procura um nome pelo saldo
                case 5:
                        double saldo;
                        try {
                            saldo = s.nextDouble();
                            procurarSaldo(registros, saldo, true);
                        }
                        //Impede que o usuário digite letras
                        catch(InputMismatchException e) {
                            System.out.println("Erro! Valor inválido. Digite um número para saldo.\n" +
                                    "Use ',' para separar decimal de inteiro.");
                            //[ERRO] Entra em loop infinito mostrando o texto do menu de opções
                            //Termina o programa para não ocorrer o erro!
                            System.exit(1);
                        }
                    break;

                    //Deletar todos os registros
                case 6:
                    deletarTodosRegistros(registros);
                    break;

                    //default -> caso o número não conha nenhuma opção!
                default:
                    System.out.println("Valor inválido. Digite um valor entre 0 e 6.");
                    //0 vai terminar o menu e acabar o loop -> while(escolha != 0)
                    //Termina o programa
                case 0:
                    //-1 volta para o menu
                case -1:
                    break;
            }
        }
    }
}

2 Respostas

E

Olá!

Três coisas:

  • Não faça uma única classe que faça tudo. Crie uma classe para cada coisa no seu programa.
  • Não crie métodos estáticos sem haver a necessidade. Percebi que todos os seus métodos e atributos são estáticos.
  • Não coloque todo esse código dentro do método main().

Link para boas práticas de programação Java: http://www.guj.com.br/posts/list/50668.java

Sobre o seu erro:
Se está dando Stream Closed, é porque vc está tentando trabalhar com o arquivo fechado.
Veja que no seu método deletarTodosRegistros() vc está fechando o arquivo logo após abrir:

Writer clean = new BufferedWriter(new FileWriter(registros)); //aqui vc está abrindo seu arquivo clean.close(); //aqui vc fecha
Vc tem que invocar o método close() somente após terminar tudo o que vc tem que fazer.

Espero ter ajudado.
[]'s

C

Eu normalmente não faço tudo na mesma classe. Nem gosto de usar a classe com o void main(! :smiley: Estou só praticando e estava com preguiça de fazer outras classes. :lol:

Sobre o erro.
Bom, o método deleta o conteúdo, porque o BufferedWriter limpa o arquivo quando é criado, exceto quando tem um parâmetro boolean true.
O erro era porque eu fechei o Write registrar e BufferedRead ler.
O clean eu não precisava usar, só precisava que ele fosse criado, limpando o arquivo, e depois fechado para salvar.
O registrar e ler são criados logo no começo do programa, e eu fechava ele sempre que um método acabava e eu precisava salvar o arquivo.
Esse foi o problema!

Valeu mesmo! Sem sua dica de que estava fechado eu ficaria preso para sempre! :smiley:

Criado 24 de janeiro de 2010
Ultima resposta 25 de jan. de 2010
Respostas 2
Participantes 2