Java 仅输出循环的最后一行

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

大家好。我有一个程序,生成1000行文本,并将其保存到名为Salary的文件中。每行的格式为:firstNamei、lastNamei、随机排名和适合该排名的随机工资。然而,当我运行这个程序时,它只输出循环的第1000行。然而,我注意到,当我没有将PrintWriter放在try语句中并在循环结束后自己关闭它时,它运行良好并生成所有1000行。为什么它只根据当前的状态生成最后一行?

您应该打开PrintWriter一次,然后从循环中多次写入,而不是相反:

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++) {
   }
 }