我正在尝试将文件从Windows server1复制到另一个Windows Server2,并且不确定将try catch块放在何处。我希望在Windows server1或windows server2关闭时通知用户,而复制过程正在通过弹出窗口或在textArea中显示,这里是我的swingworker代码。提前致谢
class CopyTask extends SwingWorker<Void, Integer>
{
private File source;
private File target;
private long totalBytes = 0;
private long copiedBytes = 0;
public CopyTask(File src, File dest)
{
this.source = src;
this.target = dest;
progressAll.setValue(0);
progressCurrent.setValue(0);
}
@Override
public Void doInBackground() throws Exception
{
ta.append("Retrieving info ... ");
retrieveTotalBytes(source);
ta.append("Done!\n");
copyFiles(source, target);
return null;
}
@Override
public void process(List<Integer> chunks)
{
for(int i : chunks)
{
progressCurrent.setValue(i);
}
}
@Override
public void done()
{
setProgress(100);
}
private void retrieveTotalBytes(File sourceFile)
{
File[] files = sourceFile.listFiles();
for(File file : files)
{
if(file.isDirectory()) retrieveTotalBytes(file);
else totalBytes += file.length();
}
}
private void copyFiles(File sourceFile, File targetFile) throws IOException
{
if(sourceFile.isDirectory())
{
if(!targetFile.exists()) targetFile.mkdirs();
String[] filePaths = sourceFile.list();
for(String filePath : filePaths)
{
File srcFile = new File(sourceFile, filePath);
File destFile = new File(targetFile, filePath);
copyFiles(srcFile, destFile);
}
}
else
{
ta.append("Copying " + sourceFile.getAbsolutePath() + " to " + targetFile.getAbsolutePath() ); //appends to textarea
bis = new BufferedInputStream(new FileInputStream(sourceFile));
bos = new BufferedOutputStream(new FileOutputStream(targetFile));
long fileBytes = sourceFile.length();
long soFar = 0;
int theByte;
while((theByte = bis.read()) != -1)
{
bos.write(theByte);
setProgress((int) (copiedBytes++ * 100 / totalBytes));
publish((int) (soFar++ * 100 / fileBytes));
}
bis.close();
bos.close();
publish(100);
}
}
答案 0 :(得分:2)
可能发生异常的行在哪里?这是我找到任何例外的第一个地方。
通常,如果您的模块很小,您可以将try
包装在模块中的所有实际代码周围,并在最后捕获异常,特别是如果异常是致命的。然后,您可以记录异常并向用户返回错误消息/状态。
但是,如果例外不是致命的,那么策略是不同的。在这种情况下,您必须在抛出连接异常的位置处理它,以便在连接返回时无缝地恢复。当然,这是一个更多的工作。
编辑 - 您可能希望在bis.close()
块内bos.close()
和finally
以确保它们已关闭。它可能是迂腐但似乎是谨慎的。