Java 仅输出循环的最后一行
大家好。我有一个程序,生成1000行文本,并将其保存到名为Salary的文件中。每行的格式为:firstNamei、lastNamei、随机排名和适合该排名的随机工资。然而,当我运行这个程序时,它只输出循环的第1000行。然而,我注意到,当我没有将PrintWriter放在try语句中并在循环结束后自己关闭它时,它运行良好并生成所有1000行。为什么它只根据当前的状态生成最后一行?您应该打开PrintWriter一次,然后从循环中多次写入,而不是相反:Java 仅输出循环的最后一行,java,file,loops,for-loop,random,Java,File,Loops,For Loop,Random,大家好。我有一个程序,生成1000行文本,并将其保存到名为Salary的文件中。每行的格式为:firstNamei、lastNamei、随机排名和适合该排名的随机工资。然而,当我运行这个程序时,它只输出循环的第1000行。然而,我注意到,当我没有将PrintWriter放在try语句中并在循环结束后自己关闭它时,它运行良好并生成所有1000行。为什么它只根据当前的状态生成最后一行?您应该打开PrintWriter一次,然后从循环中多次写入,而不是相反: import java.io.*; imp
import java.io.*;
import java.util.Random;
public class LargeDataset {
public static void main(String[] args) throws Exception {
File file = new File("src/Salary.txt");
if (file.exists()) {
System.out.print("Sorry this file already exists.");
System.exit(0);
}
String firstName = "";
String lastName = "";
String rank = "";
double salaryRange = 0.0;
for (int i = 1; i <= 1000; i++) {
try (PrintWriter output = new PrintWriter(file))
{
firstName = "FirstName" + i;
lastName = "LastName" + i;
rank = generateRandomRank();
if (rank == "assistant")
salaryRange = generateSalary(50000.00, 80000.00);
else if (rank == "associate")
salaryRange = generateSalary(60000.00, 110000.00);
else
salaryRange = generateSalary(75000.00, 130000.00);
output.printf("%s %s %s $%.2f", firstName, lastName, rank, salaryRange);
output.println();
}
}
}
public static String generateRandomRank() {
String[] rank = {"assistant", "associate", "full"};
Random random1 = new Random();
return rank[random1.nextInt(3)];
}
public static double generateSalary(double minSalary, double maxSalary) {
double randomSalary = minSalary + Math.random() * (maxSalary - minSalary);
return randomSalary;
}
}
这也应该起作用,因为现在,即使您为循环的每次迭代都创建了一个新的PrintWriter,您还是以追加模式打开了底层文件,因此每一行都应该被正确写入。每次迭代1000次,您都在创建一个新文件
for (int i=1; i <= 1000; i++) {
try (PrintWriter output = new PrintWriter(new FileOutputStream(file, true)) {
// same logic
}
}
在循环之前移动它
for (int i = 1; i <= 1000; i++) {
try (PrintWriter output = new PrintWriter(file))
...
}
谢谢,这是有道理的。如果这个答案有帮助,请考虑投票和/或接受这个。answer@RyanFoster什么是不清楚的?在循环的每次迭代中,您都会打开PrintWriter,而且您不会在追加模式下打开它,因此您只需一行就可以覆盖文件。我给了你两个解决问题的方法,第一个更好。
for (int i = 1; i <= 1000; i++) {
try (PrintWriter output = new PrintWriter(file))
...
}
try (PrintWriter output = new PrintWriter(file)) {
for (int i = 1; i <= 1000; i++) {
}
}