2013-12-19 169 views
1

我正在製作一個程序,我需要爲一個文件添加一個隨機6位數的ID列表。目前每當我運行這部分程序時,都沒有添加到文件中。我究竟做錯了什麼,以便代碼不寫入文件?我檢查並確保所有的隨機數字肯定正在生成。BufferedWriter沒有寫入文件

static HashSet<Integer> idHashList = 
     new HashSet<>(); 

public static void createIds(){ 
    File writeId = new File("peopleIDs.txt"); 
    try { 
     FileWriter fw = new FileWriter(writeId,true); 
     BufferedWriter out = new BufferedWriter(fw); 

     for(int i = 0; i < 100; i++){ 
      out.write(People.genRand()); 
     } 
     out.close(); 
    } catch (IOException ex) { 
     System.out.println(ex.getMessage()); 
    } 
} 

protected static int genRand(){ 
    while(true){ 
     int rand = ((int) ((Math.random() * (899999))+100000)); 
     if(idHashList.add(rand)){ 
      return rand; 
     } 
    } 
} 
+1

1)是否編譯?看起來你有兩個相同的方法。 2)爲什麼在代碼中沒有使用idHashList? 3)你確定'People.genRand()'在做你的想法嗎?您是否嘗試過打印出它返回的內容,然後將其寫入文件以測試內容? –

+1

Woops! @HovercraftFullOfEels兩次拷貝同樣的東西:P。現在修復它 – bob

+1

@TomaszGawel爲什麼? 'flush()'在'close()中自動發生''參見Javadoc。 – EJP

回答

4

它可能寫入文件,但不是您認爲的文件。 Java將寫入當前目錄中的peopleIDs.txt文件。當前目錄是執行java命令的目錄。

如果從IDE啓動程序,請檢查運行配置以查看它使用的當前目錄。如果您確實不知道,請在您的硬盤上搜索peopleIDs.txt以查找。

也就是說,close()應該在最後一塊。或者甚至更好,你應該使用try-with-resources構造。

+0

可以確認名稱爲'peopleIds.txt'的所有文件都爲空。我正在使用NetBeans,並且它們也有一個文件目錄,其中包含一個空的同名文件。 – bob

+1

然後要麼你有一個異常,但沒有看到錯誤信息,或者'genRand()'返回一個空字符串,或者這個方法永遠不會被調用。 –

+0

我正在打印我的異常,所以我會看到是否有一個,並且正如我上面所述,這些數字是絕對正在生成的,因爲它們在命令行中顯示時在print return語句之前添加了'return rand; '。爲了實現這一點,該方法必須被稱爲:P。 – bob

1

你打電話的方法不對。 BufferedWriter.write(int)只寫一個char.檢查Javadoc。如果你想寫的整數二進制四個字節,你需要DataOutputStream.writeInt().如果你想將它寫成一個字符串,你需要BufferedWriter.write(""+People.genRand()),可能跟着BufferedWriter.newLine().

0

您可以嘗試填補你的文件中像下一個:

PrintWriter writer = null; 
try { 
    writer = new PrintWriter("peopleIDs.txt", "UTF-8"); 
    for (int i = 0; i < 100; i++) { 
     writer.println(genRand()); 
    } 
} catch (IOException ex) { 
    System.out.println(ex.getMessage()); 
} finally { 
    if(writer != null){ 
     writer.close(); 
    } 
} 
相關問題