2016-01-17 68 views
0

当我在Java控制台中打印出来时,下面的程序完美地工作,但是当我尝试追加要放入文本文件的程序时,它仅将1/5的学生平均值打印到附加的文本文件中。如何将java输出附加到文本文件?

Bobby, average = 93 

我想这是所有印刷5学生的平均水平为提前让

Agnes, average = 76 
Bufford, average = 91 
Julie, average = 94 
Alice, average = 39 
Bobby, average = 93 

感谢。

每次它进入这一行时间
import java.util.*; 
import java.io.*; 
public class StudentAverage { 
public static void main(String[]args) throws IOException { 


Scanner scanner = new Scanner(new   
File("D:\\School\\StudentGrades.txt")); 

while (scanner.hasNextLine()) { 

    Scanner scanners = new Scanner(scanner.nextLine()); 

    String name = scanners.next(); 
    double total = 0; 
    int num = 0; 

    while (scanners.hasNextInt()) { 
     total += scanners.nextInt(); 
     num++; 
    } 

    PrintStream output = new PrintStream (("D:\\School\\WriteStudentAverages.txt")); 
    output.print(name + ", average = " + (Math.round(total/num))); 
    output.flush(); 
} 
scanner.close(); 
} 
} 

回答

3
PrintStream output = new PrintStream (("D:\\School\\WriteStudentAverages.txt")); 

,它会删除该文件,打开一个新的文件,仅增加当前行。在循环之前写下这一行,然后在循环中按原样保留其他代码。

+0

谢谢!很棒。 –

0

要附加您的输出/文本文件,您必须使用不同的书写方式。

我也建议使用try-with-resource块来避免memeory泄漏。

try (OutputStream output = new FileOutputStream("myFile.txt", true); 
     Writer writer = new OutputStreamWriter(output)) { 
    writer.write(name + ", average = " + (Math.round(total/num)) + '\n'); 
} 

您不必刷新/关闭它们在你的代码手动

0

有几个小故障。由于您需要使用try/resource-construct同时管理Scanner和PrintWriter,因此我宁愿将输入和输出例程分开,并将文件的相关内容临时读入内存。

这里有一个想法:

LinkedHashMap<String, Integer> students = new LinkedHashMap<>(); 

// Input routine 
try (Scanner scanner = new Scanner(new File("D:\\School\\StudentGrades.txt"))) { 
    while (scanner.hasNextLine()) { 
     try (Scanner scanners = new Scanner(scanner.nextLine())) { 
      String name = scanners.next(); 
      int total = 0; 
      int num = 0; 

      while (scanners.hasNextInt()) { 
       total += scanners.nextInt(); 
       num++; 
      } 

      students.put(name, (int) Math.round((double)total/num)); 
     }  
    } 
} 
catch (FileNotFoundException e) { 
    // do something smart 
} 

// Output routine 
try (PrintStream output = new PrintStream ("D:\\School\\WriteStudentAverages.txt")) { 
    for (Entry<String, Integer> student : students.entrySet()) { 
     output.println(student.getKey() + ", average = " + Integer.toString(student.getValue()));  
    } 
} 
catch (FileNotFoundException e) { 
    // do something smart 
} 

以上,您还可以在您的main() - 方法的签名摆脱那个讨厌的throws IOException。取而代之的是,现在有两个漂亮的异常处理程序(两个卡扣块),你可以把

  • 输入文件还没有被发现的情况下,触发一些逻辑的骨架/不可读取(第一个catch)
  • 输出文件不可写/无法创建(第二次捕获)