Java Swing JTextArea и BufferedReader - PullRequest
       7

Java Swing JTextArea и BufferedReader

0 голосов
/ 10 декабря 2018

Может кто-нибудь объяснить мне, почему мое приложение начинает зависать, если я пытаюсь добавить текст в JTextArea после чтения файла BufferedReader?

Хорошо.Я использую GUI Designer, и у меня есть этот класс

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), я получаю некоторые зависания.Кроме того, мой компьютер начинает зависать через одну минуту, и я не могу просто остановить свое приложение.

1 Ответ

0 голосов
/ 10 декабря 2018

Первое, что нужно проверить - это производительность кода на полпути между примерами - используйте BufferedReader.read() вместо BufferedReader.readLine().Я предполагаю, что он будет иметь производительность на том же уровне, хотя есть издержки при декодировании UTF-8.

Далее вы выделяете String каждый раз.Это не хорошо.Просто читать кусок с Reader.read(char[]) было бы намного лучше.Кроме того, BufferedReader.readLine() не очень эффективен, в дополнение к выделению String он также может выделять StringBuffer, заполненный внутренними компонентами каждый раз, когда он вызывает .java.nio.file.Files.readAllLines - это простой и эффективный способ загрузки файла, если вам нужны все строки, хотя это будут все String s.

Огромный оборот памяти будет причиной проблем всех потоков..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...