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;
}
}
}
}
Estou só praticando e estava com preguiça de fazer outras classes. :lol: