从另一个线程(即javafx任务)向javafx TextArea附加大量文本



我正在使用JavaFX创建一个简单的文本编辑器应用程序,如ms-notepad。我希望它能处理最大10mb的大文件,为此,我使用JavaFX并发包创建了一个任务。该任务将使用缓冲读取器读取文件,并将其附加到文本区域。我的问题是,当我用8kb到10kb这样的小文件运行任务时,它运行得很好,但当我增加文件大小时,UI开始冻结,读取几行后,它停止工作,我不得不强制停止程序。

这是我创建的任务代码。。。

public class ReadFile extends Task<String> {
private TextArea writingPad;
private File source;
public ReadFile(TextArea writingPad, File source) {
this.writingPad = writingPad;
this.source = source;
}
@Override
protected String call() throws Exception {
if (source != null && Files.exists(source.toPath())) {
if (source.isFile()) {
if (source.canRead()) {
if ((source.length() / (1024 * 1024)) <= 10) {
try (BufferedReader reader = new BufferedReader(new FileReader(source.getAbsolutePath()))) {
writingPad.clear();
updateTitle("Reading " + source.getName() + "...");
int workDone = 0;
char[] buffer = new char[8192];
int read;
while ((read = reader.read(buffer, 0, 8192)) >= 0) {
writingPad.appendText(String.valueof(buffer, 0, 8192));
workDone += read;
updateProgress(workDone, source.length());
}
} catch (IOException ignored) {
}
} else {
System.out.println("File is loo large.");
}
} else {
System.out.println("Can't read file.");
}
} else {
System.out.println("Is a directory.");
}
} else {
System.out.println("Is null");
}
return null;
}}

上面的代码抛出了像NullPointerExceptionIndexOuofBoundException这样的异常,所以为了解决这个异常,我使用了这个->Platform.runLater(() -> writingPad.appendText(String.valueOf(buffer, 0, finalread))); Thread.sleep(100);方法,但它也不能帮助我正确地实现我的目标。因为它解决了异常的问题,但即使是小文件也需要太多时间来读取,而对于大文件,问题仍然是一样的。我在网上搜索过,但没有找到任何能解决我问题的解决方案。

这就是我想要的:-

  • 我想要一种有效且高效的方式来读取文本文件(最大大小10mb(,并在文本区域中显示其内容
  • 阅读和写作的整个过程来自另一个线程(即JavaFX任务(,因此UI不应冻结过程中
  • 由于我的应用程序是一个文本编辑器,因此没有任何其他UI组件(如
    listview(会有所帮助

请给我一个简单易行的解决方案,因为我是JavaFX和多线程的新手。

感谢

这是Task类的javadoc摘录:

"Task的实现必须重写call((方法。此方法在后台线程上调用。此方法中使用的任何状态都必须能够安全地从后台线程读取和写入。例如,使用此方法操作实时场景图是不安全的,并且会导致运行时异常">

这应该可以清楚地说明为什么您的代码是完全错误的。

最新更新