Problema com OutputStream[RESOLVIDO]

Estou tendo um problema nesse codigo, tento imprimir no novoarquivo.txt o que eu escrevo no console, mas mesmo escrevendo, quando eu vejo, o arquivo esta vazio, qual seria o problema?

public class TesteEntradaDeArquivo {
	public static void main(String[] args) {
		try {
			InputStream is = new FileInputStream("arquivo.txt");
			OutputStream out = new FileOutputStream("novoarquivo.txt");

			Scanner entrada = new Scanner(is);
			OutputStreamWriter osw = new OutputStreamWriter(out);
			BufferedWriter bw = new BufferedWriter(osw);

			while (entrada.hasNextLine()) {
				String linha = entrada.nextLine();
				bw.write(linha);
				bw.newLine();
			}
			bw.close();
			is.close();
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}

	}

}

pq vc esta referenciando 2 arquivos??
já que vc só quer gravar, vc só precisa usar o
FileOutputStream…junto com o DataOutputStream…
ai vc captura do teclado e coloca numa variavel…
ai vc usa o writeBytes,

só precisa disoo…
tente do jeito q dise, qlqer coisa post as duvidas…

ja fiz dese jeito aki e tá funcionando…

vlw

Faça um bw.flush() antes do bw.close().

Outra coisa, para escrever em arquivos textos, use um PrintWriter associado ao seu BufferedWriter. Assim vc ganha métodos como println e printf. :slight_smile:

Puts, falta de atençao… o codigo na verdade é esse

public class TesteEditor {

	public static void main(String[] args) {
		try {
			InputStream is = System.in;
			OutputStream out = new FileOutputStream("novoarquivo.txt");

			Scanner entrada = new Scanner(is);
			OutputStreamWriter osw = new OutputStreamWriter(out);
			BufferedWriter bw = new BufferedWriter(osw);

			while (entrada.hasNextLine()) {
				String linha = entrada.nextLine();
				bw.write(linha);
				bw.newLine();
			;
			}
			bw.flush();
			bw.close();
			is.close();
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}

	}

}

Não esqueça de chamar o close num finally:

[code]
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class TesteEditor {

public static void main(String[] args) {
    try {
        Scanner entrada = new Scanner(System.in);

        FileWriter fw = null;
        BufferedWriter bw = null;
        PrintWriter pw = null;
        try {
            fw = new FileWriter("c:\novoarquivo.txt");
            bw = new BufferedWriter(fw);
            pw = new PrintWriter(bw);

            while (entrada.hasNextLine()) {
                pw.println(entrada.nextLine());
            }
        } finally {
            if (pw != null) {
                pw.flush();
                pw.close();
            }
            if (bw != null) {
                bw.flush();
                bw.close();
            }
            if (fw != null) {
                fw.flush();
                fw.close();
            }                
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

}[/code]

Burocrático, não? Sorte que no Java 7 virá uma sintaxe para facilitar essa papagaiada toda.

Na verdade, aquela é uma versão bastante purista. O flush() já chama o flush() dos streams associados, assim como o close().

Entretanto, como as variáveis foram declaradas separadamente, aconselha-se chamar os métodos close() e flush() separadamente, já que algum programador enxerido poderia manipular o bw ou fw sem passar pelo pw.

Uma forma mais compacta de fazer isso e ainda manter a garantia é evitar criar as variáveis temporárias:

[code]import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class TesteEditor {

public static void main(String[] args) {
    try {
        Scanner entrada = new Scanner(System.in);

        PrintWriter pw = null;
        try {
            pw = new PrintWriter(new BufferedWriter(new FileWriter("c:\novoarquivo.txt")));

            while (entrada.hasNextLine()) {
                pw.println(entrada.nextLine());
            }
        } finally {
            if (pw != null) {
                pw.flush();
                pw.close();
            }
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

}[/code]

O que torna o código muito mais compacto. Mas note que agora não existe nenhum bw ou fw desgarrado, que poderia colocar em tentação o nosso futuro mantenedor desse código.

eu faria assim…

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package forum;

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

/**
*

  • @author Damiao
    */

public class TestaEntradadeArquivo {
public static void main(String[] args) {
try {
FileOutputStream out = new FileOutputStream(“F:\New folder/novoarquivo.txt”);
DataOutputStream data = new DataOutputStream(out);

		Scanner entrada = new Scanner(System.in);//Erro

                    String linha;

                    do{
                       System.out.print("Digite o nome ou SAIR:");
			linha = entrada.nextLine();
			data.writeBytes(linha+" - ");

		}while(!linha.equalsIgnoreCase("sair"));
		data.close();

	} catch (IOException e) {
		System.out.println(e.getMessage());
	}

}

}
[/code]
vlw

Olha, o codigo do damião realmente deu certo, mas vini, esse ultimo codigo que você postou, nao imprimiu no arquivo, e afinal, eu dei uma olhada na api mas nao ficou claro, a funçao do metodo flush();

nesse meu periodo eu to com uma materia que é só manipulação de dados em arquivos…
e até agora (ultima semana de aula) o professor não falou desse flush() não…
eu já vi muito na net…

  • n procurei saber pra q serve não…

por isso q faço manipulação sem usar ele…

e viny, realmente pra quem conhece ele, pelo codigo q vc fez, compacta msm…

sim,
e se já resolveu seu problema “aajjbb”, coloca [RESOLVIDO] no titulo do tópico…

vlw gnt…

O flush garante que todos os buffers foram descarregados. Você tem um bufferedOutputStream de 512 bytes. Isso quer dizer que ele vai acumular em memória 512 bytes antes de efetivamente gravar no arquivo.

Sem o flush, você pode perder esses bytes, pois eles ainda estarão em buffer.

O close deveria fazer um flush automático antes de fechar, mas o contrato dos Streams e Writers não exige isso. Inclusive, já tive problemas com por não dar flush().

Note que no meu código, eu movi o novo arquivo para o diretório c:\novoarquivo.txt
E seria bom não usar o hasNextLines() no system.in e sim usar algo para interromper o fluxo, como a palavra “sair” usada pelo damiao. Já posto um exemplo com essas correções.

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class TesteEditor {
    public static void main(String[] args) {
        try {
            Scanner entrada = new Scanner(System.in);

            PrintWriter pw = null;
            try {
                pw = new PrintWriter(new BufferedWriter(new FileWriter("novoarquivo.txt")));

                String linha = "";
                do {
                    linha = entrada.nextLine();
                    pw.println(linha);
                } while (!linha.isEmpty());
            } finally {
                if (pw != null) {
                    pw.flush();
                    pw.close();
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

hummm…
agora entendi…
eu usava o close com essa função…

e só se não usase o close, era q poderia perder dados…

a explicação do meu professor foi + ou - assim…

vlw pelo esclarecimento…

Só um detalhe… seu código ainda tem um problema. Você não deve usar Streams para escrever arquivos de textos. Streams não levam em consideração a codificação em relação em países, então seu código certamente vai ter problemas com acentuação;

Ainda sobre o flush() e fechar os arquivos num finally: Esses comandos são importantes e você precisa de uma garantia de que serão executados, mesmo que haja uma exception no meio do seu código, ou mesmo que um programador venha a colocar um return ali. O finally garante essa execução.

O flush() garante que os dados que estão em memória, seja do BufferedOuputStream, do BufferedWriter ou do próprio sistema operacional sejam completamente gravados no arquivo, antes que ele seja fechado. Sem o flush, pode acontecer de faltar alguns bytes no final do arquivo.

é, foi de grande ajuda, eu ainda estou engatinhando nessas coisas de arquivos, fluxos(streams), vini se nao deve usar streams, o que devo usar?

Para dados binários: Streams
Para dados de textos: Writers

O exemplo que postei usa writers. O uso em si é muito parecido. A diferença é que os writers já tratam questões como codificação do arquivo de texto, acentuação, etc.

Ah sim, eu realmente tinha esse duvida da diferença entre os 2;