0

我正在开发一个程序,该程序将计算 2 到 10 000 之间的所有素数并将其写入文件。

人们告诉不同的方式来写入文件,所以我接受了一个建议并尝试了它。起初我把我的文件创建放在一个循环中,每次程序都重新创建文件,然后我把文件创建从循环中取出,现在我得到了错误。

有人可以告诉我这是否是这样做的方法,如果不是,应该怎么做,或者我怎样才能做到这一点?

已经有一个文件也可以工作,然后从我的程序中添加/编辑/覆盖它。

public static void main(String[] arg){
    int prime = 2;

    File file = new File("out.txt");      // how should i do this part
    FileWriter fw = new FileWriter(file.getAbsoluteFile());
    BufferedWriter bw = new BufferedWriter(fw);     

    while(prime < 10000){
        boolean isPrime = true;

        for( int i = 2; i <= sqrt(prime); i++){
            if( (prime%i) == 0 ){
                isPrime = false;
                break;
            }
        }
        if(isPrime){
            bw.write(prime + " ");     // and this
        }
        prime++;
    }
}
4

5 回答 5

2

代码看起来不错,只需确保在完成后关闭您的流。

如果不想每次都新建一个文件,可以用写模式打开一个已有的文件

如何在 Java 中创建文件并写入文件?

于 2013-09-18T19:41:54.533 回答
0

我的猜测是,您的错误是由于您的某些代码可以抛出的检查异常造成的,并且您没有捕获或声明main抛出。您还可能会泄漏资源。如果您使用的是 Java 7,我建议如下(使用try-with-resources 语句):

public static void main(String[] arg){
    File file = new File("out.txt");
    try (
        BufferedWriter bw = new BufferedWriter(new FileWriter(file))
    ) {
        for (int prime = 2; prime < 10000; ++prime) {
            boolean isPrime = true;
            final int limit = (int) sqrt(prime); // 
            for (int i = 2; i <= limit && isPrime; i++) {
                isPrime = prime % i != 0;
            }
            if (isPrime){
                bw.write(String.valueOf(prime));
                bw.newLine();
            }
        }
    } catch (IOException ex) {
        e.printStackTrace();
    }
}

在 Java 7 之前,您应该执行以下操作:

public static void main(String[] arg){
    File file = new File("out.txt");
    BufferedWriter bw = null;
    try {
        bw = new BufferedWriter(new FileWriter(file));

        for (int prime = 2; prime < 10000; ++prime) {
            boolean isPrime = true;
            int limit = (int) sqrt(prime);
            for( int i = 2; i <= limit && isPrime; i++) {
                isPrime = prime % i != 0;
            }
            if (isPrime) {
                bw.write(String.valueOf(prime));
                bw.newLine();
            }
        }
    } catch (IOException ex) {
        e.printStackTrace();
    } finally {
        if (bw != null) {
            try { bw.close(); }
            catch (IOException ignored) { }
        }
    }
}

顺便说一句,您测试素数的方法效率极低。您可能想看看使用Eratosthenes 的筛子

于 2013-09-18T20:05:58.977 回答
0

使用 StringBuffer 缓存所有素数,在 for 循环完成对所有数字的迭代后,将 StringBuffer 转换为 String 并一次性写入输出文件。

于 2013-09-19T13:56:47.557 回答
0

您必须在最后写入然后关闭 FileWriter 和 BufferedWriter。

将这些行放在循环之后的最后 -

bw.close();
fw.close();

此外 using FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);可以让您追加到现有文件。请注意“真实”。

于 2013-09-18T19:41:40.217 回答
0

如果出现故障,我会设置bw.write(prime + " ");一个try/catch块以优雅地退出。file.createNewFile()如果文件没有,您可能还想包含一条语句file.exists()

最后,确保你bw.close()是缓冲的作家。

除此之外,是的,一切看起来都符合标准。

我会做一个:

try {
  bw.write(stuff);
}
Catch (IOException e) {
  e.printStackTrace();
}
于 2013-09-18T19:45:03.900 回答