1
resposta

java.io.IOException: Stream closed

Eu estava praticando o conteúdo de Listas e resolvi implementar um pouco do que eu aprendi no curso [https://cursos.alura.com.br/course/java-trabalhando-com-io](Java e java.io: Streams, Reader e Writers) também, assim ficou o código:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class TesteComListas {

    public static void main(String[] args) throws Exception {

        ArrayList<String> lista = new ArrayList<>();

        Scanner arquivo = new Scanner(new FileInputStream(Digita("Entrada de Arquivo: ")), "UTF-8");
        while (arquivo.hasNextLine()) {
            String item = arquivo.nextLine();
            lista.add(item);
        }

        Collections.sort(lista);

        MostraPorLetra(lista);

    }

    public static String Digita(String mensagem) throws Exception {
        System.out.print(mensagem);
        BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));

        String entradaDoTeclado = buff.readLine();

        buff.close();
        return entradaDoTeclado;
    }

    public static void MostraPorLetra(List<String> lista) throws Exception {
        System.out.println("Mostrando Itens pela letra.");
        String letra = Digita("Letra: ");
        for (int i = 0; i < lista.size(); i++) {
            String item = lista.get(i);
            if (item.charAt(0) == letra.charAt(0)) {
                System.out.println(item);
            }
        }
    }

}

Porém ao executar o código, dá uma exceção "IOException: Stream Closed" na chamada do método "MostraPorLetra()". Eu chamo o método "Digita()" lá no meu Scanner, e funciona, pois eu testei esse mesmo código sem chamar o "MostraPorLetra()", dá erro quando eu chamo o "Digita()" pela segunda vez dentro do "MostraPorLetra()". Eu queria saber o porque acontece e como eu resolvo isso...

1 resposta

Por hora, eu consegui fazer o código funcionar com uma alteração no método "Digita()":

public static String Digita(String mensagem) throws Exception {
        System.out.print(mensagem);
        return new BufferedReader(new InputStreamReader(System.in)).readLine(); 
    }

Porém assim fica estranho, pois eu abro um BufferedReader, mas não fecho ele.