Java 读取日志文件并在jTextArea中显示

Java 读取日志文件并在jTextArea中显示,java,swing,file-io,jtextarea,thread-sleep,Java,Swing,File Io,Jtextarea,Thread Sleep,我试图读取一个动态变化的文件,并在jTextArea中显示其内容。 我正在使用缓冲读取器进行读取 我曾尝试在控制台上显示内容,但效果很好,但与jTextArea不兼容 我在做类似的事情 while(true) { line = br.readLine(); if(line == null) Thread.sleep(); else System.out.println(line); } 任何帮助都将不胜感激。谢谢您必须设置文本区域的文本。请尝试这样做: { lin

我试图读取一个动态变化的文件,并在jTextArea中显示其内容。 我正在使用缓冲读取器进行读取

我曾尝试在控制台上显示内容,但效果很好,但与jTextArea不兼容

我在做类似的事情

while(true)
{
  line = br.readLine();
  if(line == null)
    Thread.sleep();
  else
    System.out.println(line);
}

任何帮助都将不胜感激。谢谢

您必须设置文本区域的文本。请尝试这样做:

{
 line = br.readLine();
 if(line == null)
     Thread.sleep();
 else
     textArea.append(line + "\n");
}
这将附加(将文本放在末尾)文件,这意味着您不必担心每次运行时文本都会被删除


这应该行得通,希望有帮助。

您必须设置文本区域的文本。尝试这样做:

{
 line = br.readLine();
 if(line == null)
     Thread.sleep();
 else
     textArea.append(line + "\n");
}
String line;    
String textToDisplay = "";
while((line = br.readLine()) != null)
    textToDisplay+=line;
textArea.setText(textToDisplay);
这将附加(将文本放在末尾)文件,这意味着您不必担心每次运行时文本都会被删除

这应该行得通,希望有帮助

String line;    
String textToDisplay = "";
while((line = br.readLine()) != null)
    textToDisplay+=line;
textArea.setText(textToDisplay);
我使用了
setText(String)
而不是
append(String)
,因为它将替换
JTextArea中已有的内容。。。从你的问题我觉得这就是你想做的

我使用了
setText(String)
而不是
append(String)
,因为它将替换
JTextArea中已有的内容。。。从你的问题中,我觉得这就是你想要做的。

2点:

  • 不要在EDT中调用
    Thread.sleep()
    。这会阻止UI并阻止UI更新
  • JTextArea有一个允许加载文件的方法
例如:

JTextArea textArea = new JTextArea();
textArea.read(new FileReader("input.txt"), "blah");
2点:

  • 不要在EDT中调用
    Thread.sleep()
    。这会阻止UI并阻止UI更新
  • JTextArea有一个允许加载文件的方法
例如:

JTextArea textArea = new JTextArea();
textArea.read(new FileReader("input.txt"), "blah");

不要使用
Thread.sleep()
,您将阻止EDT。如果要“动画化”结果,请使用
javax.swing.Timer
。只要在计时器的每次迭代中读取每一行,直到它到达文件的末尾,然后停止计时器

timer = new Timer(100, new ActionListener() {
     public void actionPerformed(ActionEvent e) {
          String line;
           try {
                if ((line = reader.readLine()) != null) {
                    textArea.append(line + "\n");
                } else {
                   ((Timer) e.getSource()).stop();
                }
           } catch (IOException ex) {
                Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
           }
     }
});
测试这个程序。我想这是你想要的方式

import java.awt.BorderLayout;
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.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class ReadFile {

    File file = null;
    BufferedReader reader = null;

    private Timer timer = null;
    private JTextArea textArea;
    private JTextField jtfFile;
    private String fileName;
    private JButton browse;
    private JFrame frame;

    public ReadFile() {
        textArea = new JTextArea(25, 60);
        frame = new JFrame("Show Log");

        browse = new JButton("Browse");
        browse.addActionListener(new ShowLogListener());

        jtfFile = new JTextField(25);
        jtfFile.addActionListener(new ShowLogListener());

        timer = new Timer(100, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String line;
                try {
                    if ((line = reader.readLine()) != null) {
                        textArea.append(line + "\n");
                    } else {
                        ((Timer) e.getSource()).stop();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        JPanel panel = new JPanel();
        panel.add(new JLabel("File: "));
        panel.add(jtfFile);
        panel.add(browse);

        frame.add(panel, BorderLayout.NORTH);
        frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class ShowLogListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser chooser = new JFileChooser();
            int result = chooser.showOpenDialog(frame);
            if (result == JFileChooser.APPROVE_OPTION) {
                file = chooser.getSelectedFile();
                fileName = file.getName();
                jtfFile.setText(fileName);
                try {
                    reader = new BufferedReader(new FileReader(file));
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
                }
                timer.start();
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new ReadFile();
            }
        });
    }
}

不要使用
Thread.sleep()
,您将阻止EDT。如果要“动画化”结果,请使用
javax.swing.Timer
。只要在计时器的每次迭代中读取每一行,直到它到达文件的末尾,然后停止计时器

timer = new Timer(100, new ActionListener() {
     public void actionPerformed(ActionEvent e) {
          String line;
           try {
                if ((line = reader.readLine()) != null) {
                    textArea.append(line + "\n");
                } else {
                   ((Timer) e.getSource()).stop();
                }
           } catch (IOException ex) {
                Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
           }
     }
});
测试这个程序。我想这是你想要的方式

import java.awt.BorderLayout;
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.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class ReadFile {

    File file = null;
    BufferedReader reader = null;

    private Timer timer = null;
    private JTextArea textArea;
    private JTextField jtfFile;
    private String fileName;
    private JButton browse;
    private JFrame frame;

    public ReadFile() {
        textArea = new JTextArea(25, 60);
        frame = new JFrame("Show Log");

        browse = new JButton("Browse");
        browse.addActionListener(new ShowLogListener());

        jtfFile = new JTextField(25);
        jtfFile.addActionListener(new ShowLogListener());

        timer = new Timer(100, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String line;
                try {
                    if ((line = reader.readLine()) != null) {
                        textArea.append(line + "\n");
                    } else {
                        ((Timer) e.getSource()).stop();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        JPanel panel = new JPanel();
        panel.add(new JLabel("File: "));
        panel.add(jtfFile);
        panel.add(browse);

        frame.add(panel, BorderLayout.NORTH);
        frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class ShowLogListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser chooser = new JFileChooser();
            int result = chooser.showOpenDialog(frame);
            if (result == JFileChooser.APPROVE_OPTION) {
                file = chooser.getSelectedFile();
                fileName = file.getName();
                jtfFile.setText(fileName);
                try {
                    reader = new BufferedReader(new FileReader(file));
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
                }
                timer.start();
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new ReadFile();
            }
        });
    }
}

我也在做同样的事情。。。它在正常情况下工作,但在睡眠状态下停止工作!!我对sleep()不是很熟悉,但据我记忆,sleep应该停止当前正在发生的线程。所以这可能就是它不起作用的原因。只需去掉if(line==null)Thread.sleep();看看它是否有帮助SIF(line==null)允许我等待添加新的日志条目,以便动态读取。。。它在正常情况下工作,但在睡眠状态下停止工作!!我对sleep()不是很熟悉,但据我记忆,sleep应该停止当前正在发生的线程。所以这可能就是它不起作用的原因。只需去掉if(line==null)Thread.sleep();并查看它是否有帮助如果(line==null)允许我等待添加新的日志条目,以便可以动态读取。我需要在文件到达末尾时停止读取等待新的写入ans日志继续写入我需要在文件到达末尾时停止读取等待新的写入ans日志继续写入hanks a ton。。这很有帮助:)非常感谢。。这有助于:)