我正在制作一个复制粘贴程序进行锻炼。我注意到,在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
方法
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%?
答案 0 :(得分:1)
您需要使用多线程。在另一个线程中更新UI。该线程必须检查您的复制过程(您将需要一个变量,以便您在while循环中更新它)。在UI线程中,您将每隔几秒检查一次该变量并更新JFrame。