由于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万字节更新一次),增加缓冲区大小,问题是,有没有副作用?现在比现在快得多。谢谢。这是一个很好的候选人使用。