由于UI更新导致的Java I / O循环限制

时间:2016-05-22 19:57:44

标签: java swing

我正在制作一个复制粘贴程序进行锻炼。我注意到,在I / O的while操作中更新ui,我将传输速度降低到40%。现在需要4秒才能复制8个。

例如:

int b;
long total = 0;
byte[] buf = new byte[4096];
while ((b = in.read(buf)) != -1) {
        out.write(buf, 0, b);
        ui.setSoFar(total);
        total += b;
}

ui.setSoFar()只是在setText()

内的JLabel上调用JFrame方法

outin变量为FileInputStreamFileOutputStream

金士顿SHF37A / 120G受限于SATA II速度,复制313MB文件大约需要8秒,大约40MB / s。

如果我修改代码看起来像这样:

int b;
byte[] buf = new byte[4096];
while ((b = in.read(buf)) != -1) {
        out.write(buf, 0, b);
}

这是一个简单的循环,读写之间没有任何内容,复制313MB文件大约需要3秒,即100MB / s。

通过输出几乎差不多有60%!

如何解决这个问题,所以我仍然可以更新UI并保持100%的传输速度,而不是失去60%?

1 个答案:

答案 0 :(得分:1)

您需要使用多线程。在另一个线程中更新UI。该线程必须检查您的复制过程(您将需要一个变量,以便您在while循环中更新它)。在UI线程中,您将每隔几秒检查一次该变量并更新JFrame。