2013-08-19 50 views
1

請問誰能告訴我,如何檢查文件是否存在於只有FTP協議的URL上?即時通訊使用此代碼:請檢查文件是否帶有「ftp」url,請使用java

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

它不工作時,我送有不止一個或兩個,它只是最高審計機關

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 和像

+1

確保只有一個連接是活動的時間,所以使用信號燈1個公開售票,並釋放門票時連接「做它的目的」 .. – Shark

+0

我想檢查是否存在,它更好地使用HTTP進行請求,如果進一步,您想要下載該文件,而不是去FTP – Freak

+0

請粘貼完整的異常/堆棧跟蹤 – Freak

回答

3

這裏的問題是什麼,這種方法並不線程安全;如果兩個線程同時使用此方法,則可以覆蓋名爲輸入的實例變量,導致另一個線程不關閉它打開的連接(並關閉任何內容,或者關閉其他線程打開的連接)。

這很容易固定,通過使輸入局部變量:

InputStream input=null; 

代碼風格:在方法中,你可以只要你知道它返回的結果。初學者經常首先聲明變量,然後執行邏輯並在方法結束時返回結果。您可以通過

  • 聲明變量節省了大量的代碼和複雜性儘可能晚(當你第一次需要他們)
  • 聲明儘可能少的變量,需要(可讀性始終是一個很好的理由添加變量,但不變量只要你知道結果意味着更少的複雜性)
  • 返回(減少路徑通過您的代碼,從而降低複雜性)

的代碼可以簡單地寫爲:

public static boolean exists (String urlName) throws IOException { 
    try { 
     new URL(urlName).openStream().close(); 
     return true; 
    } catch (IOException e) { 
     return false; 
    } 
}