2013-01-22 190 views
6

所以我有這個FTP服務器裏面有一堆文件夾和文件。Java:從FTP服務器訪問文件

我的程序需要訪問此服務器,讀取所有文件並顯示其數據。

出於開發目的,我一直在使用我的硬盤上的文件,在「src」文件夾中。

但現在服務器已啓動並運行,我需要將軟件連接到它。

基本上我想要做的是獲取服務器上特定文件夾中的文件列表。

這是我到目前爲止有:

URL url = null; 
File folder = null; 
try { 
    url = new URL ("ftp://username:[email protected]/server"); 
    folder = new File (url.toURI()); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
data = Arrays.asList(folder.listFiles(new FileFilter() { 
    public boolean accept(File file) { 
     return file.isDirectory(); 
    } 
})); 

但我得到的錯誤「URI方案不是‘文件’。」

我明白了,這是因爲我的網址開頭是「FTP://」,而不是「文件:」

不過,我似乎無法找出什麼我應該怎麼辦呢!

也許有更好的方法去做這件事?

+0

爲什麼你認爲'File'構造函數處理比一個'文件以外的任何其他:'網址是什麼? – parsifal

+0

這個問題已經被多次詢問過了;也許其他答案之一會幫助你:http://stackoverflow.com/search?q=[java]+Accessing+a+File+from+an+FTP+Server – parsifal

+0

你想成爲有用的,或玩世不恭嗎? 我很希望。問題是我需要一個文件列表。 我不知道任何其他方式去做這件事。 –

回答

7

File對象不能處理的FTP連接,你需要使用一個URLConnection

URL url = new URL ("ftp://username:[email protected]/server"); 
URLConnection urlc = url.openConnection(); 
InputStream is = urlc.getInputStream(); 
... 

考慮作爲替代FTPClientApache Commons Net其中有許多協議的支持。這是一個FTP list files example

+0

關於URLConnection的事情是,我只能從中獲取InputStream。如果我可以使用InputStream來獲取文件列表,那麼肯定... –

+0

看一下這個例子,在第13行上它說'client.connect(「ftp.server.com」);'但是我得到一個錯誤當我嘗試這個時,它說這個方法對於FTPClient是未定義的。 –

+0

該方法[絕對存在](http://commons.apache.org/net/api-3.2/org/apache/commons/net/SocketClient.html#connect(java.lang.String))。你有正確的進口? – Reimeus

3

如果你使用URI與文件,你可以使用你的代碼,但是,當你想使用ftp,所以你需要這種類型的代碼;代碼清單你的FTP服務器

import java.net.*; 
import java.io.*; 

public class URLConnectionReader { 
    public static void main(String[] args) throws Exception { 
     URL url = new URL("ftp://username:[email protected]/server"); 
     URLConnection con = url.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
            con.getInputStream())); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
      System.out.println(inputLine); 
     in.close(); 
    } 
} 

下的文件名EDITEDDemo Code Belongs to Codejava

package net.codejava.ftp; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 

public class FtpUrlListing { 

    public static void main(String[] args) { 
     String ftpUrl = "ftp://%s:%[email protected]%s/%s;type=d"; 
     String host = "www.myserver.com"; 
     String user = "tom"; 
     String pass = "secret"; 
     String dirPath = "/projects/java"; 

     ftpUrl = String.format(ftpUrl, user, pass, host, dirPath); 
     System.out.println("URL: " + ftpUrl); 

     try { 
      URL url = new URL(ftpUrl); 
      URLConnection conn = url.openConnection(); 
      InputStream inputStream = conn.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line = null; 
      System.out.println("--- START ---"); 
      while ((line = reader.readLine()) != null) { 
       System.out.println(line); 
      } 
      System.out.println("--- END ---"); 

      inputStream.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
+1

服務器文件夾現在只有test.txt。 當我這樣做時,我得到以下輸出: 'drwx --- rwx 2 trucker2 inetuser 4096 Jan 22 12:40。 drwx --- rx 10 trucker2 inetuser 4096 Jan 22 10:53 .. -rw ---- r-- 1 trucker2 inetuser 8 Jan 22 12:40 test.txt' 那麼我該如何使用它來讀取文件...? –

+0

這些代碼列出了您的目錄下的文件名稱,實際上列出了它們。當前目錄,..父目錄和你的test.txt如果你想獲得更多關於這些文件的詳細信息,你可以查看編輯鏈接。 – erhun

相關問題