public static void main(String[] args) throws IOException {
File file = new File("C:\Documents and Settings\marcelo\Desktop\TestandoWriters.txt");
if(!file.exists()){
file.createNewFile();
System.out.println("Arquivo criado com sucesso");
}else{
System.out.println("Arquivo ja existe");
}
FileWriter fw = new FileWriter(file, true);
PrintWriter pw = new PrintWriter(fw);
BufferedWriter bw = new BufferedWriter(pw);
int i = 0;
while(i < 20){
bw.write("Marcelo"); // era pra gravar
bw.newLine(); // passar para proxima linha do arquivo
i++;
}
}
É porque você fechou o arquivo antes de escrevê-lo (ao usar fw.close). O jeito recomendado de usar arquivos é criar apenas uma varíavel, não 3, 4 ou 5, para cada arquivo. Faça assim:
PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter (file, true)));
int i = 0;
while(i < 20){
pw.println("Marcelo");
i++;
}
pw.close(); // Isto fecha o pw, que fecha o BufferedWriter, que fecha o FileWriter, que grava tudo em arquivo.
Prontinho, muito mais claro, fácil e funcional. Deixe sempre o PrintWriter como o mais “externo”, já que ele tem os métodos práticos “println” e “printf”,
Tire fw.close(); que funciona pq vc usa ela pra criar o PrintWriter .
Melhor ainda é usar o PrintWriter sem BufferedWriter pq ele escreve a String no arquivo e já gera a quebra de linha que vc faz c/
bw.write("Marcelo");
bw.newLine();
Pois é. Um arquivo, em Java, é algo que não é escrito imediatamente no disco; normalmente é gravado de 8 em 8 kbytes se você usar um BufferedWriter. Isso é feito para tornar seu programa mais rápido, porque cada escrita em disco leva tempo, mesmo que seja para escrever 1 byte somente.
Isso quer dizer que se você sair de seu programa sem usar “close”, provavelmente os últimos 8 kbytes do seu arquivo, se não até mais, não serão gravados adequadamente.