使用java将数据写入顺序文本文件

时间:2014-06-26 15:47:27

标签: java validation

有一个文本文件' clients.txt'有以下内容:

100 James Green 123.45
200 Sue Magenta 12345.67

它有两个记录。在第一个记录' 100'是帐号,詹姆斯'是FirstName,' Green'是LastName和' 123.45'是平衡。

以下代码是' AccountRecord.java'包含上述字段和例程集get方法的文件:

  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'。它有一个代码行:' output = new Formatter(" 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
} 

main方法代码的最后一部分为:

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 :(得分:1)

编辑:修正错误

Ctrl+Z不是Windows下的防弹方法。你最好(因为帐号必须> 0)说: To terminate input, enter 0 and Enter。然后立即行

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

添加

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