1

FTPプロトコルのみのURLにファイルが存在するかどうかを確認するにはどうすればよいですか?このコードを使用しています:

   public boolean exists(String URLName) throws IOException {
        input = null;
        boolean result = false;
        try {
            input = new URL(URLName).openStream();
            System.out.println("SUCCESS");
            result = true;
        } catch (Exception e) {
            System.out.println("FAIL");
        } finally {
            if (input != null) {
                input.close();
                input = null;
            }
        }
        return result;
    }

1つまたは2つ以上送信すると機能しません。

    sun.net.ftp.FtpProtocolException: Welcome message: 421 Too many connections (2) from this IP

        at sun.net.ftp.FtpClient.openServer(FtpClient.java:490)
        at sun.net.ftp.FtpClient.openServer(FtpClient.java:475)


at sun.net.www.protocol.ftp.FtpURLConnection.connect(FtpURLConnection.java:270)
    at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:352)
    at java.net.URL.openStream(URL.java:1010)
    at bibparsing.PDFImage.exists(PDFImage.java:168)
    at bibparsing.PDFImage.main(PDFImage.java:189)

プロトコルが HTTP の場合にうまく機能します。私は次のようなアドレスを意味します:

ftp://cmp.felk.cvut.cz/pub/cmp/articles/chum/Chum-TR-2001-27.pdf ftp://cmp.felk.cvut.cz/pub/cmp/articles/martinec/Kamberov -ISVC2006.pdf など

4

1 に答える 1

3

ここでの問題は、このメソッドがスレッド セーフではないことです。2 つのスレッドがこのメソッドを同時に使用すると、一方がinputという名前のインスタンス変数を上書きし、他方のスレッドが開いた接続を閉じない (そして、何も閉じないか、または他方のスレッドによって開かれた接続を閉じる) ことができます。

これは、入力変数をローカルにすることで簡単に修正できます。

InputStream input=null;

コード スタイル:メソッド内では、結果がわかるとすぐに結果を返すことができます。初心者は、最初に変数を宣言してから、ロジックを実行し、メソッドの最後に結果を返すことがよくあります。によって、多くのコードと複雑さを節約できます。

  • 変数をできるだけ遅く宣言する(最初に変数が必要になったとき)
  • 必要な数の変数を宣言する(可読性は常に変数を追加する正当な理由ですが、変数が少ないということは複雑さが少ないことを意味します)
  • 結果がわかったらすぐに戻る(コードのパスを減らし、複雑さを軽減する)

コードは次のように簡単に記述できます。

public static boolean exists (String urlName) throws IOException {
    try {
        new URL(urlName).openStream().close();
        return true;
    } catch (IOException e) {
        return false;
    }
}
于 2013-08-19T15:32:03.637 に答える