我正在研究一个计算2到10 000之间的alla素数并将其写入文件的程序。
人们告诉我们如何写一个文件的不同方法,所以我采取了一个消化并尝试了。 起初我把我的文件创建放在一个循环中,每次重新创建文件的程序结束,然后我把文件创建从循环开始,现在我得到了错误。
有人可以告诉我这是否是这样做的方式,如果没有,应该怎么做,或者我怎样才能做到这一点?
已经有一个文件也可以工作,然后只需从我的程序中添加/编辑/覆盖它。
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++;
}
}
答案 0 :(得分:2)
代码看起来很好,只要确保在完成后关闭你的流。
如果您不想每次都创建一个新文件,可以在写入模式下打开现有文件
答案 1 :(得分:0)
您必须在最后编写然后关闭FileWriter和BufferedWriter。
将这些行放在循环后的最后一行 -
bw.close();
fw.close();
此外,使用FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
可以将您附加到现有文件。请注意'真实'。
答案 2 :(得分:0)
如果某些内容失败,我会将bw.write(prime + " ");
置于try/catch
块中以优雅地退出。如果文件不是file.createNewFile()
,您可能还希望包含file.exists()
语句。
最后,请确保bw.close()
缓冲的编写者。
除此之外,是的,一切都看起来很平等。
我会做:
try {
bw.write(stuff);
}
Catch (IOException e) {
e.printStackTrace();
}
答案 3 :(得分:0)
我的猜测是你的错误是由于某些代码可以抛出的已检查异常,以及你没有捕获或声明main
抛出。您也可能泄漏资源。如果您使用的是Java 7,我建议使用以下内容(使用try-with-resources statement):
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) { }
}
}
}
顺便说一下,你测试素性的方法非常低效。您可能需要查看使用Sieve of Eratosthenes。
答案 4 :(得分:0)
使用StringBuffer缓存所有素数,并在for循环完成迭代所有数字后,将StringBuffer转换为String并一次性写入输出文件。