0

Windows server1 から別の Windows server2 にファイルをコピーしようとしていますが、try catch ブロックを配置する場所がわかりません。コピープロセスがポップアップまたはテキストエリアに表示されている間にWindows server1またはwindows server2がシャットダウンするたびにユーザーに通知したいのですが、ここに私の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);
        }
    }
4

1 に答える 1

2

例外が発生する可能性のある行はどこですか? それは私が例外を見つける最初の場所です。

一般に、モジュールが小さい場合は、モジュールtry内のすべての実際のコードをラップして、最後に例外をキャッチできます (特に例外が致命的である場合)。次に、例外をログに記録し、エラー メッセージ/ステータスをユーザーに返すことができます。

ただし、例外が致命的でない場合、戦略は異なります。この場合、接続が返されたときにシームレスに再開できるように、接続例外がスローされた場所で処理する必要があります。もちろん、これはもう少し作業です。

編集 - おそらく、ブロック内でそれらが確実に閉じられるようにする必要がbis.close()あります。衒学的かもしれませんが、賢明に見えます。bos.close()finally

于 2012-12-23T14:32:02.657 に答える