2013-03-22 120 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當您完成它以節省系統資源時。