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…
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:
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.
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());
}
}
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…
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.
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.
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.