为什么这个java代码不起作用?

时间:2013-09-22 08:54:05

标签: java file-io interface exception-handling

我想要做的是非常基本的:我有一个包含按钮的界面;当我按下该按钮时,我希望我的程序从文本文件中读取下一行并将其显示在文本字段中。但没有任何反应,我有一种感觉,因为它没有正确读取我的文件:\请帮助,我是Java世界中的一个完整的新手,我甚至高兴我摆脱了编译错误(是的,我!)但这更糟糕,因为现在我不知道该怎么去谷歌:))

package practice;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class MyApp extends JFrame {
    JButton button;
    JTextArea afisaj; 

    MyApp(){ 
        setTitle("MyApp");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        init();
        setSize(500,500);
        setLocationRelativeTo(null); 
        setVisible(true); 
    }

    public void init(){
        this.setLayout(null);

        button = new JButton("Read more");
        afisaj = new JTextArea();

        button.setBounds(200,50,100,30); 
        add(button); 

        afisaj.setBounds(40,100,400,300);
        add(afisaj); 
    }

public static void main(String[] args){
    final MyApp m = new MyApp(); 

    File f = new File("C:\\myfile.txt");
    BufferedReader b = new BufferedReader(new InputStreamReader(System.in));   
    try{
    b = new BufferedReader(new FileReader(f));  
    }
    catch (FileNotFoundException e){System.out.println("error 1")}

    final BufferedReader bf = b; 

      m.button.addActionListener(new ActionListener(){     
      public void actionPerformed(ActionEvent e){
          String s = new String();        
          try{
                if ((s=bf.readLine())!= null){
                    m.afisaj.append(s);  
                }
            }
            catch (Exception ee){System.out.println("error 2")}   
      }      
    }); 

    try{
    bf.close(); 
    }
    catch (Exception e1){System.out.println("error 3")}; 

}

}

3 个答案:

答案 0 :(得分:0)

问题是您定义的流在try块中关闭。因此,当您尝试阅读时,Stream会关闭。

答案 1 :(得分:0)

1,数据无法共享,bf在click事件中没有到达

final BufferedReader bf = b; 

2,代码修改如下以实现结果

public static void main(String[] args) {
    final MyApp m = new MyApp();
    m.button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            File f = new File("C:\\myfile.txt");
            BufferedReader b = new BufferedReader(new InputStreamReader(
                    System.in));
            try {
                b = new BufferedReader(new FileReader(f));
            } catch (FileNotFoundException ee) {
            }

            String s = new String();
            try {
                while ((s = b.readLine()) != null) {
                    m.afisaj.append(s);
                }
                b.close();
            } catch (Exception ee) {
            }
        }
    });
}

答案 2 :(得分:0)

关闭窗口时应关闭流。现在,在为按钮注册事件侦听器后关闭它。在你真正按下按钮之前。

public static void main(String[] args) throws Exception {
  final MyApp m = new MyApp();

  File f = new File("myfile.txt");
  BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
  b = new BufferedReader(new FileReader(f));

  final BufferedReader bf = b;

  m.button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      String s = new String();
      try {
        if ((s = bf.readLine()) != null) {
          m.afisaj.append(s);
        }
      } catch (Exception ex) {
        throw new RuntimeException(ex);
      }
    }
  });

  m.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
      try {
        bf.close();
      } catch (Exception ex) {
        throw new RuntimeException(ex);
      }
    }
  });
}

请停止吞噬异常。系统遗嘱告诉你,一旦你掌握了这些信息,那个流就会被关闭,剩下的就很简单了!