简体   繁体   English

Java Swing JTextArea和BufferedReader

[英]Java Swing JTextArea and BufferedReader

Can someone explain me why my app start to freeze if I try to add a text to JTextArea after reading a file by BufferedReader? 有人可以解释一下为什么我在通过BufferedReader读取文件后尝试向JTextArea添加文本时为什么我的应用程序开始冻结吗?

Ok. 好。 I use a GUI Designer and I have this class 我使用GUI设计器,并且有此类

public class ReaderTest {
private JPanel rootPanel;
private JTextArea textArea;
private JButton readButton;
private File file;

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        JFrame frame = new JFrame("Reader");
        frame.setContentPane(new ReaderTest().rootPanel);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(800, 600);

        frame.setVisible(true);
    });
}

private ReaderTest() {
    readButton.addActionListener(e -> {
        file = new File("/path/to/6.3MBfile");
        new Thread(new FileReader()).start();
    });
}

class FileReader implements Runnable {

    @Override
    public void run() {
        reader1();
//        reader2();
    }

    private void reader1() {
        try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {
            int count;

            StringBuilder str = new StringBuilder();
            while ((count = inputStream.read()) != -1) {
                str.append((char) count);
            }

            textArea.setText(str.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void reader2() {
        try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
             BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {

            String line;
            StringBuilder str = new StringBuilder();

            while ((line = bufferedReader.readLine()) != null) {
                str.append(line);
            }

            textArea.setText(str.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}

If I read a file by BufferedInputStream (reader1), I don't have any freezes. 如果我通过BufferedInputStream(reader1)读取文件,则不会冻结。 But If I read it by BufferedReader (reader2), I get some freezes. 但是,如果我通过BufferedReader(reader2)读取它,则会冻结。 Furthermore, my PC start to freeze after one minute and I can't simply stop my app. 此外,一分钟后我的PC开始冻结,我无法简单地停止我的应用程序。

The first thing to check is the performance for code half way between the examples - use BufferedReader.read() instead of BufferedReader.readLine() . 首先要检查的是示例之间的代码性能-使用BufferedReader.read()而不是BufferedReader.readLine() I assume it'll have performance in the same ballpark, although there is overhead doing UTF-8 decoding. 我认为它会在相同的范围内发挥性能,尽管执行UTF-8解码会有开销。

Next up you are allocating a String each time. 接下来,您每次都分配一个String That's not good. 这不好。 Just reading a chunk with Reader.read(char[]) would be much better. 仅使用Reader.read(char[])读取一个块会更好。 Further BufferedReader.readLine() isn't very efficient, in addition to allocating the String it may also allocate a StringBuffer complete with internals every time it is call . 此外, BufferedReader.readLine()效率不是很高,除了分配String之外,它还可能在每次调用时分配带有内部函数StringBuffer java.nio.file.Files.readAllLines is an easy and efficient way to load a file if you want all strings, though it will be all String s. java.nio.file.Files.readAllLines是一种简单有效的加载文件的方式,如果您想要所有字符串,尽管它都是String

The huge turnover of memory will be what is causing all threads to have problems. 巨大的内存周转将导致所有线程出现问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM