1

Activites.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

現在、テーブルから現在選択されているアクティビティのすべての情報を表示するフレームにボタンがあり、フレームは正常に機能します。選択したアクティビティのすべてのデータが正しく表示されます。

私が今しなければならないことは、ボタンが押されたときに、編集/置換が必要なデータを見つける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つの方法を次に示します。

  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 に答える