Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Exercício 4 java.io

Quando utiliza entada do sistema, ou seja, System.in como parametro de entrada de dados, seja Scanner ou InputStream, não consigo escrever em um arquivo através do OutputStream > OutputStreamWriter > BufferedWriter. Porém, utilizando o mesmo código e alterando o System.in por FileInputStream, consigo pegar dados de um arquivo e copiar em outro. Além disso, se eu troco o OutputStream por PrintStream e uso o System.in como parâmetro, eu consigo copiar dados do console.

Alguem sabe explicar o problema?

Exemplo do código que não funciona:

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

        InputStream is = System.in;

        InputStreamReader isr = new InputStreamReader(is);

        BufferedReader br = new BufferedReader(isr);

        OutputStream os = new FileOutputStream("saida.txt"); 

        OutputStreamWriter osw = new OutputStreamWriter(os);

        BufferedWriter bw = new BufferedWriter(osw);

        String linha = br.readLine();
        while (linha != null) {
            bw.append(linha);
            bw.newLine();
            linha = br.readLine();
        }

        br.close();
        bw.close();
    }
6 respostas

Oi Renan, testei seu código aqui e funcionou corretamente. Você pode verificar se seu importes estão corretos?

Os imports são todos de java.io. Rodo o programa, digito um conteúdo qualquer, pressiono Enter, atualizo o projeto e o arquivo de saída não atualiza na minha máquina.

solução!

Olá, Renan.

Quando você pressiona Enter o programa termina? Eu tive que alterar o while(linha != null) para while(!linha.isEmpty()) para ele sair do loop quando eu desse enter numa linha em branco, e o arquivo foi escrito.

A outra forma que consegui fazer com que ele funcionasse no meu sistema foi colocar o construtor de BufferedReader br dentro de um try como eclipse deve sugerir:

 InputStreamReader isr = new InputStreamReader(is);
        BufferedWriter bw;
        try (BufferedReader br = new BufferedReader(isr)) {
            OutputStream os = new FileOutputStream("saida.txt");
            OutputStreamWriter osw = new OutputStreamWriter(os);
            bw = new BufferedWriter(osw);
            String linha = br.readLine();
            while (linha != null){
                bw.append(linha);
                bw.newLine();
                linha = br.readLine();
            }
        }
        bw.close();
    }

que aí mesmo terminando com ctrl+c o arquivo é escrito. mas parece que a intenção é fazer quando a linha estivar em branco, então acho que while(!linha.isEmpty) seja melhor. ou ainda:

public static void main(String[] args) throws FileNotFoundException, IOException {
        InputStream is = System.in;

        InputStreamReader isr = new InputStreamReader(is);
        BufferedWriter bw;
        try (BufferedReader br = new BufferedReader(isr)) {
            OutputStream os = new FileOutputStream("saida.txt");
            OutputStreamWriter osw = new OutputStreamWriter(os);
            bw = new BufferedWriter(osw);
            String linha = br.readLine();
            while (linha.isEmpty()) {
                bw.append(linha);
                bw.newLine();
                linha = br.readLine();
            }
        }
        bw.close();
    }
}

perdao, o post não pode ser editado, mas acima eu quis dizer

while(!linha.isEmpty())

Skywalker , na verdade, duas coisas estavam fazendo o código não funcionar aqui:

  • (linha != null) - foi necessário trocar por (!linha.isEmpty()) realmente; e

  • Ao pressionar o Enter, o código não funciona com o Enter central do teclado mas apenas com o Enter do teclado numérico (eu não sabia que havia diferença).

Muito grato pela ajuda!