2016-08-15 108 views
2

我必須從用戶處取得用戶的姓名和地址,並將其放入文本文件中。我寫了以下代碼: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

回答

6

您創建了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

1

到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

嘗試使用沖水()。此方法刷新流。

+1

這不是一個完整的答案。你需要解釋一下爲什麼它是必要的。 – 4castle

相關問題