gpt4 book ai didi

Java Swing JTextArea 和 BufferedReader

转载 作者:行者123 更新时间:2023-12-02 10:29:23 25 4
gpt4 key购买 nike

有人可以解释一下,如果我在通过 BufferedReader 读取文件后尝试向 JTextArea 添加文本,为什么我的应用程序开始卡住?

好的。我使用 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();
}
}
}
}

如果我通过 BufferedInputStream (reader1) 读取文件,则不会出现任何卡住。但是如果我通过 BufferedReader (reader2) 阅读它,我会遇到一些卡住。此外,我的电脑在一分钟后开始卡住,我无法简单地停止我的应用程序。

最佳答案

首先要检查示例之间代码的性能 - 使用 BufferedReader.read() 代替 BufferedReader.readLine()。我认为它的性能大致相同,尽管进行 UTF-8 解码会产生开销。

接下来,您每次都会分配一个String。这不好。只需使用 Reader.read(char[]) 读取一个 block 就会好得多。此外 BufferedReader.readLine() 效率不高,除了分配 String 之外,它还可能分配一个包含内部结构的 StringBuffer >每次调用时。如果您想要所有字符串,java.nio.file.Files.readAllLines 是一种简单高效的加载文件的方法,尽管它都是 String

内存的巨大周转将导致所有线程出现问题。

关于Java Swing JTextArea 和 BufferedReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53697566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com