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

由于UI更新而导致Java I/O循环限制,java,swing,Java,Swing,我正在制作一个复制粘贴程序以供练习。我注意到,在更新中的ui时,在操作I/O时,我将传输速度限制在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.setSoF

我正在制作一个复制粘贴程序以供练习。我注意到,在更新
中的ui时,在操作I/O时,我将传输速度限制在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()

out
in
变量是
FileInputStream
FileOutputStream

当金斯敦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%?

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

好吧,使用40MB/s并每4096字节更新一次UI,您将每秒更新UI大约10000次-没有人会这么快阅读UI。试着减少更新UI的频率(可能每40万字节更新一次),增加缓冲区大小,问题是,有没有副作用?现在比现在快得多。谢谢。这是一个很好的候选人使用。