1

有一个文件Activites.dat,其格式如下:


ActivityName
SupervisorName
位置
是否已支付?

例如数据

Sunday
Advanced Open Water Dive Certificate
Mr.Jones
N/A
Yes

Sunday
Sailing
Mr. Jackson
N/A
Yes

Sunday
Generation Next
Ms.Steele
N/A
Yes

现在,我在一个框架上有一个按钮,它显示了表格中当前选定活动的所有信息,并且框架工作正常;所选活动的所有数据都正确显示。

我现在需要做的是,当btnSave按下按钮时,保留原始值进行匹配Activities.dat以找出需要编辑/替换的数据,存储用户当前输入的数据,然后新数据替换中的旧数据Activities.dat

例如想要的结果

最初的

Sunday
Advanced Open Water Dive Certificate
Mr.Jones
N/A
Yes

Sunday
Sailing
Mr. Jackson
N/A
Yes

Sunday
Generation Next
Ms.Steele
N/A
Yes

编辑版本

Sunday
Advanced Open Water Dive Certificate
Mr.Jones
N/A
Yes

**Monday**
**Sailing Elite Course**
**Mr.Jonathan**
**HS5**
**No**

Sunday
Generation Next
Ms.Steele
N/A
Yes

我当前(不工作)的代码

    private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {                                        

//ALL "original-" STRINGS ARE INITIALISED BEFORE

        String nActivityName  =   txtActivityName.getText();
        Object nDay  =   comboboxDay.getSelectedItem().toString();
        String nSupervisor = txtSupervisor.getText();
        String nLocation = txtLocation.getText();
        String nPaid = null;

        //Check which option is selected: Paid or Not Paid
        if(radioYes.isSelected())
        {
            nPaid = radioYes.getText();
        }
        if(radioNo.isSelected())
        {
            nPaid = radioNo.getText();
        }

        File file = new File("Activities.dat");

        try{
                BufferedReader reader = new BufferedReader(new FileReader(file));
                BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));

                while(reader.ready())
                {
                    String RDay = reader.readLine();    
                    String RActivityName = reader.readLine();
                    String RSupervisor = reader.readLine();
                    String RLocation = reader.readLine();
                    String RPaid = reader.readLine();
                    String nothing = reader.readLine();

                    //Match the exact same set of data as the original activity's data before edit.
                    if(RActivityName.equals(originalActivityName))
                    {
                        RDay.replace(RDay, (CharSequence) nDay);
//                                = nDay.toString();
                        RActivityName = nActivityName;
                        RSupervisor = nSupervisor;
                        RLocation = nLocation;
                        RPaid = nPaid;
                        nothing = nothing;
                    }
                    System.out.println(RDay + RActivityName + RSupervisor + RLocation + RPaid);
                }


        }
        catch(IOException e)
        {
                Logger.getLogger(AddActivity.class.getName()).log(Level.SEVERE, null, e);
        }

    }       

我可以存储原始值以进行比较并获取新数据,但我不知道如何用Activities.dat. 我该怎么做呢?

是的,我知道我有一个BufferedReader,但我没有使用它,因为我不知道在这种特殊情况下在哪里或如何使用它。

4

1 回答 1

1

这是执行“读/写整个文件”方法的一种方法:

  1. 创建一个封装单个活动的类,因此您可以在比一堆字符串更高的级别上实现逻辑:

    class Activity {
      String day;
      String activityName;
      String supervisorName;
      String location;
      String paid;
    }
    

    这是一个非常粗略的课程大纲。为简洁起见,我没有包含适当的构造函数、getter hashCode()equals()toString().

  2. 创建另一个只关心从/向文件读取和写入活动的类。这再次使您的代码更易于理解。

    想想你想从那个类中得到什么,这些应该是调用者唯一可见的方法,例如

    /** Write activities to a file. */
    void writeActivities(File file, List<Activity> activities);
    
    /** Read activities from a file. */
    List<Activity> readActivities(File file);
    

    然后实现方法,例如

    public class ActivityManager {
      // Don't rely on te platform default, use a fixed charset.
      private final static Charset UTF_8 = Charset.forName("UTF-8");
    
      /** Write activities to a file. */
      void writeActivities(File file, List<Activity> activities)
          throws IOException {
        try (PrintWriter out = new PrintWriter(
            new OutputStreamWriter(new FileOutputStream(file), UTF_8))) {
          boolean first = true;
          for (Activity activity : activities) {
            if (!first) {
              // Print a newline after every activity.
              out.println();
            }
            writeActivity(out, activity);
            if (first) {
              first = false;
            }
          }
        }
      }
    
      private void writeActivity(PrintWriter out, Activity activity) {
        out.println(activity.day);
        out.println(activity.activityName);
        out.println(activity.supervisorName);
        out.println(activity.location);
        out.println(activity.paid);
      }
    
      /** Read activities from a file. */
      List<Activity> readActivities(File file) throws IOException {
        try (BufferedReader in = new BufferedReader(
               new InputStreamReader(new FileInputStream(file),
            UTF_8))) {
          List<Activity> result = new ArrayList<Activity>();
          while (true) {
            Activity activity = readActivity(in);
            result.add(activity);
    
            String line = in.readLine();
            if (line == null) {
              break; // Reached end of file.
            }
            if (!line.equals("")) {
              throw new IllegalStateException(
                "Expected empty line but got: <" + line + ">");
            }
          }
          return result;
        }
      }
    
      private Activity readActivity(BufferedReader in) throws IOException {
        Activity activity = new Activity();
        activity.day = in.readLine();
        activity.activityName = in.readLine();
        activity.supervisorName = in.readLine();
        activity.location = in.readLine();
        activity.paid = in.readLine();
        return activity;
      }
    }
    

    上面的代码依赖于 Java 7 中引入的try-with-resources 功能。对于早期版本的 Java,您需要try通过恢复为链接中显示的通常的 declare-try-finally-close 样式来重写这两个块。

  3. 从您的 UI 事件处理代码(如actionPerformed()方法)中,只需调用一个实例ActivityManager来读取和写入活动并在您的 UI 组件和Activity类之间进行转换。

于 2013-03-17T11:04:09.603 回答