2013-03-22 116 views
0

我正在创建一个程序,它可以创建指定数量的类中的成绩日志,并将此数据写入文本文件。它写日期,班级名称,成绩(或至少应该),和结束语。出于某种原因,我无法弄清楚,我的程序只打印日期和课程名称。有任何想法吗?BufferedWriter打印不正确?

下面的代码:

 BufferedWriter data = null; //Writes Output 

    try { 

     File log = new File ("Grade.txt"); //Name of File 
     FileWriter fileWriter = new FileWriter (log, true); //Appends File 
     data = new BufferedWriter (fileWriter); //Creates BufferedWriter 
     Date date = new Date(); //Sets Date 

       //Code here makes an array of class names 

      System.out.print ("Enter Assignment Name: "); 
       title = reader.nextLine(); 
       data.write (title); 
       data.newLine(); //Blank Line 
       reader.nextLine(); //Consume Input 
       System.out.print ("Enter Points Possible: "); 
       temp = reader.nextInt(); 

       if (temp < 0){ 

        throw new ArithmeticException (""); 

       }else{ 

        poss += temp; 
        data.write(poss); 

       }//Close If 

       System.out.print ("Enter Points Earned"); 
       temp = reader.nextInt(); 

       if (temp < 0){ 

        throw new ArithmeticException (""); 

       }else{ 

        earn += temp; 
        data.write(earn); 

       }//Close If 

回答

0

你不.close()作家或该文件的程序结束之前。如果您不关闭写入器,则无法保证其内部缓冲区会刷新到文件和磁盘。

如果使用的是Java7,那么你可以使用try-与资源的便利性和正确性:

try (FileWriter fileWriter = new FileWriter (log, true); //Appends File 
     BuferredWriter data = new BufferedWriter (fileWriter); //Creates BufferedWriter 
    ) 
    { 
    data.write("..."); 
    } 
+0

不关闭它只是消耗系统资源,它不应该导致写入文件的问题。 – syb0rg 2013-03-22 00:55:14

+0

也许,但Java并不能保证一个对象的终结器会被调用。如果作者的终结器没有被调用,那么它不一定会刷新它的缓冲区。 – dsh 2013-03-22 01:00:25

+0

我并不认为你不应该“关闭”流,但这不是OP问题的原因。 – syb0rg 2013-03-22 01:02:35

0

移动阅读器到下一行读点后。使用reader.nextInt时,输入只读取数字,而不是按Enter时创建的新行字符。 reader.nextInt读取新的行字符并清除缓冲区后,调用reader.nextLine。

BufferedWriter data = null; //Writes Output 

try { 

    File log = new File ("Grade.txt"); //Name of File 
    FileWriter fileWriter = new FileWriter (log, true); //Appends File 
    data = new BufferedWriter (fileWriter); //Creates BufferedWriter 
    Date date = new Date(); //Sets Date 

      //Code here makes an array of class names 

     System.out.print ("Enter Assignment Name: "); 
      title = reader.nextLine(); 
      data.write (title); 
      data.newLine(); //Blank Line 
      reader.nextLine(); //Consume Input 
      System.out.print ("Enter Points Possible: "); 
      temp = reader.nextInt(); 
      reader.nextLine(); //added this 

      if (temp < 0){ 

       throw new ArithmeticException (""); 

      }else{ 

       poss += temp; 
       data.write(poss); 

      }//Close If 

      System.out.print ("Enter Points Earned"); 
      temp = reader.nextInt(); 
      reader.nextLine(); //added this 

      if (temp < 0){ 

       throw new ArithmeticException (""); 

      }else{ 

       earn += temp; 
       data.write(earn); 

      }//Close If 
0

nextInt()方法离开\n(端线)符号,并且由nextLine()立即回升,跳过下一个输入。你想要做的是使用nextLine()的一切,后来又对其进行分析:

String nextIntString = keyboard.nextLine(); //get the number as a single line 
int nextInt = Integer.parseInt(nextIntString); //convert the string to an int 

这是迄今为止最简单的方法,以避免出现问题 - 不要混合你的“下一个”的方法。之后只使用nextLine(),然后解析int或单独的单词。

此外,您应该始终使用close()您的BufferedWriter当您完成它以节省系统资源时。