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;
    }

当我发送超过一两个时它不起作用,它只是sais

    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

这里的问题是这个方法不是线程安全的;如果两个线程同时使用此方法,则可以覆盖名为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 回答