2013-12-19 122 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(); 
    } 
} 
相关问题