gpt4 book ai didi

java - FileInputStream/FileOutputStream 阻塞?

转载 作者:行者123 更新时间:2023-12-02 07:03:17 25 4
gpt4 key购买 nike

我有以下成功复制文件的代码。但是,它有两个问题:

  1. progressBar.setValue() 之后的 System.out.println() 不会打印 0 到 100 之间的间隔(仅打印“0”直到打印“100”为止)
  2. 除了由于问题 #1 导致进度条的值可能以某种方式错误之外,在实际代码中我也进行了其他视觉更改,但它们在处理整个文件之前不会显示。我认为 FileInputStream/FileOutputStream 函数是非阻塞的。如何更改以下代码,以便进度条实际上在操作过程中更新?

启 Action 业方法:

private void startJob(File inFile, File outFile) {
long offset = 0;
int numRead = 0;
byte[] bytes = new byte[8192];
long fileLength = inFile.length();
Boolean keepGoing = true;

progressBar.setValue(0);

try {
inputStream = new FileInputStream(inFile);
outputStream = new FileOutputStream(outFile, false);
System.out.println("Total file size to read (in bytes) : " + inputStream.available());
} catch (FileNotFoundException err) {
inputStream = null;
outputStream = null;
err.printStackTrace();
} catch (IOException err) {
inputStream = null;
outputStream = null;
err.printStackTrace();
}

if (inputStream != null && outputStream != null) {
while (keepGoing) {
try {
numRead = inputStream.read(bytes);
outputStream.write(bytes, 0, numRead);
} catch (IOException err) {
keepGoing = false;
err.printStackTrace();
}
if (numRead > 0) {
offset += numRead;
}

if (offset >= fileLength) {
keepGoing = false;
}

progressBar.setValue(Math.round(offset / fileLength) * 100);
System.out.println(Integer.toString(Math.round(offset / fileLength) * 100));
}
}
if (offset < fileLength) {
//error
} else {
//success
}

try {
inputStream.close();
outputStream.close();
} catch (IOException err) {
err.printStackTrace();
}
}

最佳答案

我怀疑您正在从 EDT 调用冗长的方法。 。例如,通过将操作放入其自己的 Runnable 中,然后调用

,从 EDT 中删除您的操作
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
progressBar.setValue(value);
// or any other GUI changes you want to make
}
});

否则,您的操作将阻止 EDT 直到完成,并且在 EDT 被阻止的情况下,将无法处理重绘等事件 -> 直到最后才可见 GUI 更改。

关于java - FileInputStream/FileOutputStream 阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16387244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com