1

こんにちは、以下のメソッドを使用して Jtextarea からファイルに書き込みます。タイマー内で 30 秒ごとにこのメソッドを呼び出しますが、ファイルに新しい行のみを追加する代わりに、Jtextarea に含まれる行全体を書き換えるので、行が重複します。 . これを避けて、新しい行だけでファイルを更新したいと思います。私を手伝ってくれますか。

public void loger() {

    FileWriter writer = null;

    try {
        writer = new FileWriter("MBM_Log_"+date()+".txt" , true);
        textArea.write(writer);

        } catch (IOException exception) {
        System.err.println("log error");
        exception.printStackTrace();

        } finally {
        if (writer != null) {
            try {
                writer.close();
                } catch (IOException exception) {
                System.err.println("Error closing writer");
                exception.printStackTrace();
            }
        }

    }

  }
4

4 に答える 4

1
writer = new FileWriter("MBM_Log_"+Date()+".txt" , true);

上記のコードは、コンストラクターで追加のブール値フラグを使用し、false にして再試行します。

writer = new FileWriter("MBM_Log_"+Date()+".txt" , false);

毎回新しいファイルを作成しないようにするには、メソッドの外で一度ファイル ライターを初期化してから、それを使用します。

FileWriter writer = new FileWriter("MBM_Log_"+date()+".txt" , true);

public void loger() {

    try {       
        textArea.write(writer);
        } catch (IOException exception) {
        System.err.println("log error");
        exception.printStackTrace();
        } finally {
        if (writer != null) {
            try {
                writer.close();
                } catch (IOException exception) {
                System.err.println("Error closing writer");
                exception.printStackTrace();
            }
        }
    }
  }
于 2012-03-20T19:23:19.343 に答える
1

変化する:

writer = new FileWriter("MBM_Log_"+Date()+".txt" , true);

に:

writer = new FileWriter("MBM_Log_"+Date()+".txt", false);

あるいは単に:

writer = new FileWriter("MBM_Log_"+Date()+".txt");

に使用しているコンストラクターはFileWriterStringファイル名とboolean、ファイルが既に存在する場合にファイルに追加するかどうかを示す2 つの引数を取ります。現在これを設定しtrueているため、ファイルを現在のテキストだけのファイルに置き換えるのではなく、テキスト領域のコンテキストをファイルに追加しています。

ファイルの既存の内容を保持する場合は、次のいずれかを行います。

  • 追加オプションを使用し続け、アプリケーションを閉じるときにのみファイルを更新します。
  • アプリケーションの起動時にファイルの内容を読み取り、テキスト領域の現在の内容を追加する前に、これを新しいファイルに書き出します。
于 2012-03-20T19:23:41.427 に答える
1

間違いなくファイルに追加する必要があります(したがってtrue、コンストラクターに残してください)。

少し間違っているのは、Swing コンポーネントを使用してデータを保存することです。Swing コンポーネントは、データを表示するように設計されています。マネージャー/スーパーバイザー/教師が、別の GUI ライブラリを使用するか、アプリケーション全体を Web サーバーに変換するように指示した場合にどうなるか想像してみてください。JTextArea を放棄する必要があり、ログ メッセージを保存する場所がなくなります。

たとえば、ログ メッセージのコレクションを用意し、Listこのコレクションを使用してメッセージを表示する必要があります。ログ メッセージ クラスには、ログ メッセージを に変換する関数を含めることができますString。次に、30 秒ごとにリストを調べて、最後に保存した時刻よりも新しいタイムスタンプを持つメッセージを追加するだけです。

于 2012-03-20T21:36:03.403 に答える
0

代わりに、Jtextareaからファイルに書き込むようにコードを変更しました。文字列(LOG)をファイルに直接書き込みます。私のメソッドloger()は次のようになります:public void loger(String texLine){

    FileWriter writer = null;

    try {       
        writer = new FileWriter("MBM_Log_"+date()+".txt" , true);
        PrintWriter out = new PrintWriter(writer);
        out.printf("%s"+"%n", texLine);
                    out.close();
        } catch (IOException exception) {
        System.err.println("log error");
        exception.printStackTrace();
        }

    finally {
        if (writer != null) {
            try {
                writer.close();
                } catch (IOException exception) {
                System.err.println("Error closing writer");
                exception.printStackTrace();
            }
        }
    }

    }

次に、GUIに表示されるJtextareaにログを書き込み、loger()メソッドを呼び出してファイルに書き込みます。例:

textArea.append(dateTime()+ ":メニューバーからオペレーターによってミュートされたアラーム音");

loger(dateTime()+ ":メニューバーからオペレーターによってミュートされたアラーム音");

このようにして、Jtextareaとファイルにログがあります。アプリケーションを再起動すると、ファイルが消去されず、新しいログがファイルに追加されると、問題は解決します。ありがとうございます。

于 2012-03-21T22:34:43.690 に答える