web-dev-qa-db-ja.com

Java-URLが存在するかどうかを確認する最も簡単な方法

こんにちは私は多くの異なるURLを通過し、それらが存在するかどうかをチェックするだけのプログラムを書いています。基本的に、返されたエラーコードが404かどうかを確認しています。ただし、1000を超えるURLをチェックしているので、これを非常に迅速に実行できるようにしたいと考えています。以下は私のコードですが、どのように変更してすばやく機能するようにできるのかと思っていました(可能な場合):

final URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
int responseCode = huc.getResponseCode();

if (responseCode != 404) {
System.out.println("GOOD");
} else {
System.out.println("BAD");
}

JSoupを使用する方が速いでしょうか?

一部のサイトはコード200を提供し、独自のエラーページがあることを認識していますが、確認しているリンクがこれを行わないことを知っているため、これは必要ありません。

20
Matt9Atkins

Getリクエストの代わりに「HEAD」リクエストを送信してみてください。レスポンスボディはダウンロードされないので、それはより速いはずです。

huc.setRequestMethod("HEAD");

ここでも、応答ステータスが400ではないかどうかをチェックする代わりに、200であるかどうかをチェックします。つまり、否定ではなく肯定をチェックします。 404,403,402 ..すべての40xステータスは、無効な存在しないURLとほぼ同等です。

あなたはそれをさらに速くするためにマルチスレッドを利用するかもしれません。

30
Vishnuprasad R

次のDNSサーバーに質問してみてください

class DNSLookup
{
    public static void main(String args[])
    {
        String Host = "stackoverflow.com";
        try
        {
            InetAddress inetAddress = InetAddress.getByName(Host);
            // show the Internet Address as name/address
            System.out.println(inetAddress.getHostName() + " " + inetAddress.getHostAddress());
        }
        catch (UnknownHostException exception)
        {
            System.err.println("ERROR: Cannot access '" + Host + "'");
        }
        catch (NamingException exception)
        {
            System.err.println("ERROR: No DNS record for '" + Host + "'");
            exception.printStackTrace();
        }
    }
}
1
Khinsu

タイムアウトプロパティを設定できるようです。許容できることを確認してください。また、テストするURLが多数ある場合は、並行して実行すると、はるかに高速になります。これがお役に立てば幸いです。

0
Spark8006