BufferedWriter没有写入文件

问题描述:

我必须从用户处取得用户的姓名和地址,并将其放入文本文件中。我写了以下代码:BufferedWriter没有写入文件

package selfTest.nameAndAddress; 

import com.intellij.codeInsight.template.postfix.templates.SoutPostfixTemplate; 

import java.io.*; 
import java.util.Arrays; 

/** 
* Created by 
*/ 
public class Test { 
    public static void main(String[] args) throws IOException { 
     InputStreamReader isr=new InputStreamReader(System.in); 
     BufferedReader br=new BufferedReader(isr); 


     //creating addressbook text file 
     File fl=new File("E:/addressbook.txt"); 
     fl.createNewFile(); 

     FileReader fr=new FileReader(fl); 
     BufferedReader in=new BufferedReader(fr); 



     boolean eof=false; 
     int inChar=0; 

     String[] name=new String[2]; 
     String[] address=new String[2]; 

     int counter=0; 


     do{ 
      FileWriter fw=new FileWriter(fl); 
      BufferedWriter out=new BufferedWriter(fw); 

      System.out.println("Enter "+(counter+1)+" students name "+" and address"); 

      name[counter]=br.readLine(); 
      address[counter]=br.readLine(); 

      out.write(name[counter]); 
      System.out.println("Nmae: "+name[counter]+" ddress: "+address[counter]); 
      counter++; 
     }while(counter<2); 
    } 
} 

当我运行代码时,它从用户接收输入,但文本文件为空。地址和名称不写入文本文件。如何在上面的代码中将名称和地址存储到文本文件中。

+0

您需要关闭流。 –

+4

我建议使用[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)为您的流,读者,作者等设置块,以确保一切关闭并适当地冲洗。 – ManoDestra

您创建了BufferedWriter,但从来没有flushclose它。

这些操作究竟写入文件


由于@ManoDestra在评论中指出,Java支持的try-with-resources statement,它允许您格式化之类的语句:

try(BufferedWriter out = new BufferedWriter(new FileWriter(fl))) { 

由于BufferedWriter实现了接口AutoCloseable,当try块出口时,Java将自动处理out的清理

+1

@ManoDestra我从来没有真正知道尝试与资源。谢谢你今天给我一些新的东西! :) – Jeeter

+1

不客气。现在Java 7和8中有很多好东西。我现在使用try-with-resources和自定义函数接口来允许我传递抛出异常的lambdas。检查那些也是:) – ManoDestra

到BufferedWriter将一个更简单的方法是为PrintStream:

PrintStream printer = new PrintStream(new File("filepath")); 
System.setOut(printer); 

然后你就可以打印任何你想要的文件,例如

printer.println(name[counter]); 

,然后在年底关闭它:

printer.close(); 
+0

我不知道这是否真的是一个解决方案。 OP很想知道为什么这个文件没有被写入,并且你建议完全更改他的代码,而不用说为什么 – Jeeter

+1

@Jeeter哦,对不起,我是新来的。我看到了你的回应,我只是想提出一个替代方案供将来参考。 – AlterV

+0

我从来没有见过'System.setOut' ...为什么在这之后不使用'System.out'? – 4castle

尝试使用冲水()。此方法刷新流。

+1

这不是一个完整的答案。你需要解释一下为什么它是必要的。 – 4castle