在一个随机访问文件中添加数据:javagui



我正在尝试创建一个学生信息系统,该系统可以添加、更新、查看、删除和搜索数据。我正在编写添加数据的代码,请告诉我哪里出了问题,因为每次我输入roll no时,它只接受第一个,然后提示"roll no已经存在"。但如果我关闭jar文件并再次打开它,然后输入roll no,它将第一次再次接受。我创建了一个.dat文件来输入数据。

附言:我是一个初学者,刚刚开始使用java

import java.io.*;
public class Record
{
  int rollNo, standard;
  String firstName, lastName, address;
  public void read( RandomAccessFile file) throws IOException
  {
    rollNo = file.readInt();
    byte b1[] = new byte[15];
    file.readFully(b1);
    firstName = new String(b1, 0);
    byte b2[] = new byte[15];
    file.readFully(b2);
    lastName = new String(b2, 0);
    standard = file.readInt();
    byte b3[] = new byte[15];
    file.readFully(b3);
    address = new String(b3, 0);
  }
  public void write( RandomAccessFile file) throws IOException
  {
    file.writeInt( rollNo );
    byte b1[] = new byte[15];
    if( firstName != null)
    firstName.getBytes( 0 , firstName.length(), b1, 0);
    file.write(b1);
    byte b2[] = new byte[15];
    if( lastName != null)
    lastName.getBytes( 0, lastName.length(), b2, 0);
    file.write(b2);
    file.writeInt( standard );
    byte b3[] = new byte[15];
    if( lastName != null)
    address.getBytes( 0, address.length(), b3, 0);
    file.write(b3);   
  }
  public int size(){ return 53;}
}

import java.io.*;
import java.awt.*;
public class StudentInformation extends Frame
{
  Button updateButton, newButton, deleteButton, viewButton, done;
  UpdateRec update;
  NewRec newRec;
  DeleteRec deleteRec;
  ViewRec viewRec;
  RandomAccessFile file;
  Record data;
  public StudentInformation()
  {
    super("Student Database");
    try
    {
      file = new RandomAccessFile("credit.dat", "rw");
    }
    catch(IOException e)
    {
      System.err.println(e.toString());
      System.exit(1);
    }
    data = new Record();
    setup();
  } 
  public void setup()
  {
    resize(300, 120);
    setLayout(new GridLayout(3,2));
    updateButton = new Button("Update Record");
    newButton = new Button("New Record");
    deleteButton = new Button("Delete Record");
    viewButton = new Button("View Records");
    done = new Button("Done");
    add(updateButton);
    add(newButton);
    add(deleteButton);
    add(viewButton);
    add(done);
    show();
    update = new UpdateRec(file);
    newRec = new NewRec(file);
    deleteRec = new DeleteRec(file);
    viewRec = new ViewRec(file);
  }
  public boolean action(Event event, Object o)
  {
    if(event.target instanceof Button)
    {
      String current = (String)event.arg;
      if(current.equals("Update Record"))
        update.show();
      else if(current.equals("New Record"))
        newRec.show();
      else if(current.equals("Delete Record"))
        deleteRec.show();
      else if(current.equals("View Records"))
        viewRec.show();
    } 
    return true;
  }
  public boolean handleEvent(Event event)
  {
    if(event.id == Event.WINDOW_DESTROY || event.target == done)
    {
      cleanup();
      hide();
      dispose();
      System.exit(0);
      return true;
    }
    return super.handleEvent(event);
  }
  public void cleanup()
  {
    try
    {
      file.close();
    }
    catch(IOException e)
    {
      System.err.println(e.toString());
      System.exit(1);
    }
  }
  public static void main(String args[])
  {
    StudentInformation teller = new StudentInformation();
  }
}
class NewRec extends Dialog
{
  RandomAccessFile file;
  TextField roll, fname, lname, stnd, addr;
  Button save, cancel;
  Label rollLabel, fnameLabel, lnameLabel, stndLabel, addLabel;
  Record data;
  int rollNo;
  public NewRec(RandomAccessFile f)
  {
    super(new Frame(), "New Record", true);
    resize(300,150);
    setLayout(new GridLayout(6,2));
    file=f;
    roll = new TextField(20);
    rollLabel = new Label("rollNo");
    fname = new TextField(20);
    fnameLabel = new Label("First Name");
    lname = new TextField(20);
    lnameLabel = new Label("Last Name");
    stnd = new TextField(20);
    stndLabel = new Label("Class");
    addr = new TextField(20);
    addLabel = new Label("Address");
    save = new Button("Save Changes");
    cancel = new Button("Cancel");
    add(rollLabel);
    add(roll);
    add(fnameLabel);
    add(fname);
    add(lnameLabel);
    add(lname);
    add(stndLabel);
    add(stnd);
    add(addLabel);
    add(addr);
    add(save);
    add(cancel);
    data = new Record();
  }
  public boolean action(Event event, Object o)
  {
    if( event.target == save)
    {
      rollNo = Integer.parseInt(roll.getText());
      if(rollNo<1)
      {
        roll.setText("Invalid Roll Num");
        return true;
      }
      try
      {
        file.seek((rollNo-1)*data.size());
        data.read(file);
      }
      catch( IOException e)
      {
      }
      if(data.rollNo!=0)
      {
        roll.setText(String.valueOf(data.rollNo) + " already exists");
        fname.setText("");
        lname.setText("");
        stnd.setText("");
        addr.setText("");
      }
      if(data.rollNo==0)
      {
        try
        {
          data.rollNo = rollNo;
          data.lastName = lname.getText();
          data.firstName = fname.getText();
          data.standard = Integer.parseInt(stnd.getText());
          data.address = addr.getText();
          file.seek((rollNo-1)*data.size());
          data.write(file);
        }
        catch( IOException e)
        {
          roll.setText("Error Writing File" + e.toString());
          return true;
        }
        hide();
        clear();
      }
    }
    else if(event.target == cancel)
    {
      hide();
      clear();
    }
    return true;
  }
  private void clear()
  {
    roll.setText("");
    fname.setText("");
    lname.setText("");
    stnd.setText("");
    addr.setText("");
  }
}

此外,当我在"新记录"窗口打开时按取消时,它不会清除文本字段。

我会尽力帮你的。

首先:这是一次代码审查。您应该改为使用:https://codereview.stackexchange.com/

第二:设计问题:

  • 您的代码应该使用java:序列化和反序列化的功能:什么是对象序列化?

  • 在文件中随机读取和写入,逐字节是可能的,但这是旧的方法,不太可靠。

什么在你的代码中不起作用:

  • 最重要的是,你不重置数据(在写入之后,在输入之前)

  • 发生的情况取决于您的文件大小和您之前输入的数据:如果您输入了数据15,您的文件将从偏移量0到13为空。然后,例如,如果你试图得到10:这没关系,因为你得到了0。但如果你试图获得25,你会得到一个异常(超出文件限制),然后你保留了先例数据,那么你的rollNo"已经存在"。

基本解决方案:在每次输入之前清除数据。

我添加了一个尝试捕获,也有坏数据的警告

因此,我发表了一些意见。你应该好好想想。

Voilà

public boolean action(Event event, Object o)
  {
    if( event.target == save)
    {
        // SOLUTION IS HERE
        data=new Record();
          // TRACE
        // PROBLEM HERE: data keeps precedent value
        System.out.println("SAME PLAYER PLAY AGAIN: data.rollNo ACTUALLY:"+data.rollNo);
      rollNo = Integer.parseInt(roll.getText());
      // TRACE
      System.out.println("rollNo ACTUALLY:"+rollNo);
      if(rollNo<1)
      {
        roll.setText("Invalid Roll Num");
        return true;
      }
      try
      {
        file.seek((rollNo-1)*data.size());
        data.read(file);
      }
      catch( IOException e)
      {
          // TRACE
          System.out.println("EXCEPTION IN FILE !");
        // PROBLEM HERE: data have not been defined: then keeps precedent value
      }
      // TRACE
      System.out.println("data.rollNo ACTUALLY:"+data.rollNo);
      if(data.rollNo!=0)
      {
      // TRACE
       System.out.println("ALREADY EXISTS");

        roll.setText(String.valueOf(data.rollNo) + " already exists");
        fname.setText("");
        lname.setText("");
        stnd.setText("");
        addr.setText("");
      }
      if(data.rollNo==0)
      {
          // TRACE
          System.out.println("NOT FOUND");
     try
       {
        try
        {
          data.rollNo = rollNo;
          data.lastName = lname.getText();
          data.firstName = fname.getText();
          data.standard = Integer.parseInt(stnd.getText());
          data.address = addr.getText();
          file.seek((rollNo-1)*data.size());
          data.write(file);
          // TRACE
          System.out.println("WRITE DATA "+rollNo);
        }
        catch( IOException e)
        {
          roll.setText("Error Writing File" + e.toString());
          return true;
        }
      }
     // SOLUTION
     // WARNING: IF bad datas, 
        catch( Exception ex)
        {
            System.err.println("BAD DATAS");
             JOptionPane.showMessageDialog(new JFrame(),  "WARNING: all fields must be filled !", "WARNING",
                        JOptionPane.ERROR_MESSAGE);
          return true;
        }
        hide();
        // TRACE
        System.out.println("CLEAR");
        clear();
        // PROBLEM HERE: data not reset ! see above
      }
    }
    else if(event.target == cancel)
    {
      hide();
      clear();
    }
    return true;
  }

希望它能帮助

最新更新