[英]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.