-2

Swing を使用して、ある Windows サーバーから別の Windows サーバーにディレクトリとファイルをコピーしていますが、問題なく動作します。コピー中にWindowsサーバーが予期せずダウンしたときにJoption Messagedialogをポップアップさせたいので、catchブロックでそれを指定しましたが、サーバーがダウンしたときにポップアップを表示することはありません(コピー中にWindowsサーバーを手動で再起動しますが、現れる)。誰かが助けてくれますか、ここにコードがあります

try {
    textarea.append("Copying " + sourceFile.getAbsolutePath()
        + "   to " + targetFile.getAbsolutePath());
    is = 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);
    textarea.append(" Done!\n");
} catch (Exception excep) {
    task.cancel(true);
    bos.flush();
    bis.close();
    bos.close();
    jf2 = new JFrame();
    jf2.setSize(401, 401);
    jf2.setDefaultCloseOperation(jf2.EXIT_ON_CLOSE);
    JOptionPane.showMessageDialog(jf2,
        "The Server is not accessible or it may be down because of Network Issue",
        "ERROR", JOptionPane.ERROR_MESSAGE);
} finally {
    if (bis != null) {
        bis.close();
    }
    if (bos != null) {
        bos.close();
    }
}
4

2 に答える 2

2

あなたのトライキャッチは少し悪いです。

例外が発生した場合、およびfinallyブロック内でストリームを閉じようとします。

最後に関係なく呼び出されることが保証されているため、これを使用してストリームを閉じることでコードを節約できます..

try {
    textarea.append("Copying " + sourceFile.getAbsolutePath()
                    + "   to " + targetFile.getAbsolutePath());
    is = 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));
    }

    // Not required, finally will take care of it...
    //bis.close();
    //bos.close();
    publish(100);
    // !! THIS IS VERY, VERY NAUGHTY !!
    textarea.append(" Done!\n");
} catch (Exception excep) {

    JOptionPane.showMessageDialog(null, "The Server is not accessible or it may be down because of Network Issue", "ERROR", JOptionPane.ERROR_MESSAGE);
    task.cancel(true);

} finally {

    try {
        // techniqually, this gets taken care of when you close the stream,
        // but I tend not to trust it either...
        bos.flush();
    } catch (Exception e) {
    }

    try {
        bis.close();
    } catch (Exception e) {
    }
    try {
        bos.close();
    } catch (Exception e) {
    }

}

あなたのコードは を使用しているようですがSwingWorker、その中で呼び出しtextarea.append(" Done!\n")ています。これは非常に悪いです。

メソッドprocessはこれを実行できる必要があります...基本的に、 をprocess受け取ったとき100に、テキスト領域を更新できる必要があります。

doInBackgroundまた、メソッドが例外をスローできるように、他の場所で例外を処理できるようにすることもできます。これにより、doneメソッドとメソッドを使用しgetて、例外が発生したかどうかを判断できます。追加の利点はdone、EDT 内で呼び出されることです。

于 2012-12-23T03:55:55.943 に答える
1

まず、私はすべての手動リソース管理が好きではないので、Java 7 のtry-with-resourcesを使用してそれを行うように変更します。これにより、finally ブロックと and のすべてのインスタンスを削除できclose()ますflush()(ところで、close コールはフラッシュするので、とにかく両方は必要ありません。

第二に、そのメッセージ ボックスの宣言が有効かどうかはわかりません。Javadoc にJOptionPane.showMessageDialog()は、最初のパラメーターは である必要があると書かれてComponent parentComponentいますが、代わりに新しい非表示の JFrame を宣言しているため、投稿したこのコードが JFrame クラス内にある場合は、代わりに渡しthisます。完全に、私はこれを試してみます:

try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile)))
{
    textarea.append("Copying " + sourceFile.getAbsolutePath() +
                    " to " + targetFile.getAbsolutePath());
    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));
    }
    publish(100);
    textarea.append(" Done!\n");
}
catch(Exception excep)
{
    task.cancel(true);
    JOptionPane.showMessageDialog(this, "The Server is not accessible or it may be down because of Network Issue", "ERROR", JOptionPane.ERROR_MESSAGE);
}
于 2012-12-23T03:50:40.427 に答える