0

GUI フレームを使用して、ファイルから学生の詳細を検索するコードをいくつか書きました。

  • データを正常に入力して検索ボタンをクリックすると、詳細が正しく表示されます。
  • もう一度検索をクリックすると、「見つかりません」と表示されます。

readLine() 関数が次の行を読み取ることはわかっていますが、検索ボタンを押すたびに最初から開始するようにしたいと考えています。どうやってやるの?

以下はこれまでの私のコードです。

import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
class search extends Frame implements ActionListener
{
Label lname,lresult;
TextField name;
TextArea result;
Button search,exit;
char ar;
String lines;
int n;
FileReader fr=new FileReader("student.txt");
BufferedReader br=new BufferedReader(fr);
public search() throws Exception
{
    setTitle("student details");
    setLayout(new FlowLayout());
    lname=new Label("name :");
    lresult=new Label();
    name= new TextField(20);
    result= new TextArea(50,50);
    search=new Button("search");
    exit= new Button("exit");
    add(lname);
    add(name);
    add(search);
    add(exit);
    add(lresult);
    add(result);    
    search.addActionListener(this);
    exit.addActionListener(this);
    setVisible(true);
}
public void actionPerformed(ActionEvent ae) 
{
    try
    {           
        lines=br.readLine();
        if(ae.getSource()==search)
        {
            n=lines.indexOf(name.getText());
            if(n>-1)
            {
                lresult.setText(" name found");
                result.setText(lines);
            }
            else                    
            {
                lresult.setText("not found");
                result.setText("not found");
            }
        }
    }
    catch(Exception e)
    {
    }
    if(ae.getSource()==exit)
    {
        search.this.dispose();
    }
}
public static void main(String s[]) throws Exception
{
    search se= new search();
    se.setSize(400,200);
    se.setVisible(true);
}
}
4

3 に答える 3

2

actionPerformed(..) メソッドのコードの下に移動すると、正常に動作するはずです。

    FileReader fr=new FileReader("student.txt");
BufferedReader br=new BufferedReader(fr);
于 2013-11-03T10:40:43.840 に答える
0

ストリームを読み取ると、現在の位置を示すカーソルが読み取られるバイトごとに進みます。ストリームを一度初期化すると、ポイントを過ぎて読むと、その部分に再びアクセスする機会がなくなります。(ストリームを巻き戻さない限り。)
したがって、毎回ファイルに対して新しいストリームを作成するか、ジャンプできるランダムアクセスチャネルを使用します(最適ではありませんが、でも同じことが実現できますBufferedreader.markreset


また、プロセッサ メソッドで 1 行だけを読み取ることにも注意してください。ファイルを 1 行ずつ読み取るには、while ループを使用します。

String currentLine = "";
while((currentLine = br.readLine()) != null) {
   //do the funky stuff
}
于 2013-11-03T10:46:00.007 に答える
0

RandomAccessFilea を使用して、リーダーの位置をリセットできます。

RandomAccessFile raf = new RandomAccessFile("student.txt", "rw");

public void actionPerformed (ActionEvent ae) {

    // Resets to the beginning of file
    raf.seek(0);

    // rest of the method

}

そのメソッドreadLine()は、 と同じように使用できますBufferedReader

于 2013-11-03T10:48:16.723 に答える