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.mark,但可以实现相同的效果)。reset


另请注意,您在处理器方法中只读取了一行。要逐行读取文件,请使用 while 循环:

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

您可以使用 aRandomAccessFile来重置阅读器的位置:

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()可以和 a 一样使用BufferedReader

于 2013-11-03T10:48:16.723 回答