2014-06-26 79 views
2

存在具有以下內容的文本文件「clients.txt」:將數據寫入順序文本文件與Java

100 James Green 123.45 
200 Sue Magenta 12345.67 

它有兩個記錄。在第一個記錄中,'100'是賬號,'James'是名字,'Green'是LastName,'123.45'是餘額。

下面的代碼是包含上述字段以及套路「AccountRecord.java」文件獲取方法:

public class AccountRecord { 
    private int account; 
    private String firstName; 
    private String lastName; 
    private double balance; 

    // no-argument constructor calls other constructor with default values 
    public AccountRecord() { 
    this(0, "", "", 0.0); // call four-argument constructor 
    } // end no-argument AccountRecord constructor 

    // initialize a record 
    public AccountRecord(int acct, String first, String last, double bal) { 
    setAccount(acct); 
    setFirstName(first); 
    setLastName(last); 
    setBalance(bal); 
    } // end four-argument AccountRecord constructor 

    // set account number 
    public void setAccount(int acct) { 
    account = acct; 
    } // end method setAccount 

    // get account number 
    public int getAccount() 

    return account; 
} // end method getAccount 

    // set first name 
    public void setFirstName(String first) { 
    firstName = first; 
    } // end method setFirstName 

    // get first name 
    public String getFirstName() { 
    return firstName; 
    } // end method getFirstName 

    // set last name 
    public void setLastName(String last) { 
    lastName = last; 
    } // end method setLastName 

    // get last name 
    public String getLastName() { 
    return lastName; 
    } // end method getLastName 

    //set balance 
    public void setBalance(double bal) { 
    balance = bal; 
    } // end method setBalance 

    // get balance 
    public double getBalance() { 
    return balance; 
    } // end method getBalance 
} // end clas 

下面的代碼是「CreateTextFile.java」。它有一個代碼行:「輸出=新格式化器(‘clients.txt’);」,實例化從「clients.text」格式格式化對象:

import java.io.FileNotFoundException; 
import java.lang.SecurityException; 
import java.util.Formatter; 
import java.util.FormatterClosedException; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

import com.deitel.ch17.AccountRecord; 

public class CreateTextFile 
{ 
    private Formatter output; // object used to output text to file 

    // enable user to open file 
    public void openFile() 
    { 
    try 
    { 
    output = new Formatter("clients.txt"); // open the file 
    } // end try 
    catch (SecurityException securityException) 
    { 
    System.err.println(
    "You do not have write access to this file."); 
    System.exit(1); // terminate the program 
    } // end catch 
    catch (FileNotFoundException fileNotFoundException) 
    { 
    System.err.println("Error opening or creating file."); 
    System.exit(1); // terminate the program 
} // end catch 
} // end method openFile 

// add records to file 
public void addRecords() 
{ 
    // object to be written to file 
    AccountRecord record = new AccountRecord(); 

    Scanner input = new Scanner(System.in); 

    System.out.printf("%s\n%s\n%s\n%s\n\n", 
    "To terminate input, type the end-of-file indicator ", 
    "when you are prompted to enter input.", 
    "On UNIX/Linux/Mac OS X type <ctrl> d then press Enter", 
    "On Windows type <ctrl> z then press Enter"); 

    System.out.printf("%s\n%s", 
    "Enter account number (> 0), first name, last name and balance.", 
    "? "); 

    while (input.hasNext()) // loop until end-of-file indicator 
    { 
     try // output values to file 
     { 
     // retrieve data to be output 
     record.setAccount(input.nextInt()); // read account number 
     record.setFirstName(input.next()); // read first name 
     record.setLastName(input.next()); // read last name 
     record.setBalance(input.nextDouble()); // read balance 

     if (record.getAccount() > 0) 
     { 
      // write new record 
      output.format("%d %s %s %.2f\n", record.getAccount(), 
      record.getFirstName(), record.getLastName(), 
      record.getBalance()); 
     } // end if 
     else 
     { 
      System.out.println(
      "Account number must be greater than 0."); 
     } // end else 
    } // end try 
     catch (FormatterClosedException formatterClosedException) 
     { 
     System.err.println("Error writing to file."); 
     return; 
    } // end catch 
    catch (NoSuchElementException elementException) 
    { 
     System.err.println("Invalid input. Please try again."); 
     input.nextLine(); // discard input so user can try again 
    } // end catch 

    System.out.printf("%s %s\n%s", "Enter account number (>0),", 
     "first name, last name and balance.", "? "); 
    } // end while 
} // end method addRecords 

// close file 
    public void closeFile() 
    { 
    if (output != null) 
     output.close(); 
    } // end method closeFile 
} 

代碼的主方法的最後部分是:

public class CreateTextFileTest 
{ 
    public static void main(String[] args) 
    { 
     CreateTextFile application = new CreateTextFile(); 

    application.openFile(); 
    application.addRecords(); 
    application.closeFile(); 
    } // end main 
}// end class CreateTextFileTest 

當我運行這個類,並嘗試進入一個新的記錄,我得到的消息是:

run: 
To terminate input, type the end-of-file indicator 
when you are prompted to enter input. 
On UNIX/Linux/Mac OS X type <ctrl> d then press Enter 
On Windows type <ctrl> z then press Enter 

Enter account number (> 0), first name, last name and balance. 
? 300 Har Par 112.235 
Enter account number (>0), first name, last name and balance. 
? ^z 
Invalid input. Please try again. 
Enter account number (>0), first name, last name and balance. 
? 

作爲新的節目我感到困惑的是,爲什麼這個輸入無效。我需要幫助來糾正這些代碼或糾正我的輸入。整個代碼已經提交,以便可以精確地判斷問題。我正在使用Netbean IDE 8.0和jdk-8u5-windows-64。

+1

你希望人們瀏覽大量的代碼,並找出問題的所在。大部分代碼與問題無關。只包括重現問題所需的代碼,更多的人會閱讀你的問題。 –

+0

@DonBranson我假設,因爲輸入提示說使用Ctrl + Z來終止輸入。雖然根據http://superuser.com/questions/291224/equivalent-to-d-in-bash-for-cmd-exe實際上在CMD中輸入Ctrl + Z將不會生成EOF。 – SamYonnou

+0

你說得對。看到評論後,並刪除了我的評論。 –

回答

1

編輯:修正錯誤

Ctrl+Z不是Windows下的一個防彈方法。你最好(因爲帳號必須> 0)說: To terminate input, enter 0 and Enter。然後行後立即

record.setAccount(input.nextInt()); // read account number 

添加

if (record.getAccount() == 0) { return; } 
+0

我已添加您的一排代碼。輸入0並按回車,我沒有收到任何無效的輸入消息。我獲得了BUILD SUCCESSFUL,但沒有輸出,並且'clients.txt'的內容被清除。請給我一些進一步的建議。 – Soon

+0

@ user3678356對不起,我忘了用'=='替換'>' - 發佈更新 –

+0

嗨Serge Ballesta,偉大的!!!,你的回答給了我成功,程序給出正確的輸出,所有的問題是過度。 – Soon