2013-06-14 71 views
5

Tôi đang cố gắng tải xuống tất cả các tệp từ thư mục này. Tuy nhiên, tôi chỉ có thể tải xuống url đó dưới dạng một tệp. Tôi có thể làm gì? Tôi đã cố gắng tìm kiếm vấn đề này và nó đã gây nhầm lẫn và mọi người bắt đầu đề xuất sử dụng httpclients thay thế. Cảm ơn sự giúp đỡ của bạn, đây là mã của tôi cho đến nay. Nó đã được gợi ý rằng tôi sử dụng một dòng đầu vào để đạt được tất cả các tập tin trong thư mục. Liệu điều đó có đi vào một mảng không? Tôi đã thử hướng dẫn ở đây http://docs.oracle.com/javase/tutorial/networking/urls/ nhưng nó không giúp tôi hiểu.Java tải xuống tất cả các tệp và thư mục trong một thư mục

//ProgressBar/Install 
      String URL_LOCATION = "http://www.futureretrogaming.tk/gamefiles/ProfessorPhys/"; 
      String LOCAL_FILE = filelocation.getText() + "\\ProfessorPhys\\"; 
      try { 
       java.net.URL url = new URL(URL_LOCATION); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.addRequestProperty("User-Agent", "Mozilla/4.76"); 
       //URLConnection connection = url.openConnection(); 
       BufferedInputStream stream = new BufferedInputStream(connection.getInputStream()); 
       int available = stream.available(); 
       byte b[]= new byte[available]; 
       stream.read(b); 
       File file = new File(LOCAL_FILE); 
       OutputStream out = new FileOutputStream(file); 
       out.write(b); 
      } catch (Exception e) { 
       System.err.println(e); 
      } 

Tôi cũng tìm thấy mã này sẽ trả về Danh sách tệp cần tải xuống. Ai đó có thể giúp tôi kết hợp hai mã?

public class GetAllFilesInDirectory { 

public static void main(String[] args) throws IOException { 

    File dir = new File("dir"); 

    System.out.println("Getting all files in " + dir.getCanonicalPath() + " including those in subdirectories"); 
    List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); 
    for (File file : files) { 
     System.out.println("file: " + file.getCanonicalPath()); 
    } 

} 

}

+1

Trừ khi bạn có thể truy cập tài nguyên qua URL, bạn không thể. – MadProgrammer

+0

Tôi có thể chỉnh sửa tập tin htaccess để cho phép điều đó. – Kyle

+0

Ngoài ra, sẽ tốt hơn khi sử dụng Apache HttpClient như được hiển thị ở đây: [Làm thế nào để sử dụng java.net.URLConnection để kích hoạt và xử lý các yêu cầu HTTP?] (Http://stackoverflow.com/q/2793150/1065197) –

Trả lời

5

Bạn cần tải xuống trang, danh sách thư mục, phân tích cú pháp và sau đó tải xuống các tệp inidiviudal được liên kết trong trang ...

bạn có thể làm một cái gì đó giống như ...

URL url = new URL("http:www.futureretrogaming.tk/gamefiles/ProfessorPhys"); 
InputStream is = null; 
try { 
    is = url.openStream(); 
    byte[] buffer = new byte[1024]; 
    int bytesRead = -1; 
    StringBuilder page = new StringBuilder(1024); 
    while ((bytesRead = is.read(buffer)) != -1) { 
     page.append(new String(buffer, 0, bytesRead)); 
    } 
    // Spend the rest of your life using String methods 
    // to parse the result... 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} finally { 
    try { 
     is.close(); 
    } catch (Exception e) { 
    } 
} 

Hoặc, bạn có thể tải Jsoup và sử dụng nó để làm tất cả những công việc khó khăn ...

try { 
    Document doc = Jsoup.connect("http:www.futureretrogaming.tk/gamefiles/ProfessorPhys").get(); 
    Elements links = doc.getElementsByTag("a"); 
    for (Element link : links) { 
     System.out.println(link.attr("href") + " - " + link.text()); 
    } 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

nào outputted ...

?C=N;O=D - Name 
?C=M;O=A - Last modified 
?C=S;O=A - Size 
?C=D;O=A - Description 
/gamefiles/ - Parent Directory 
Assembly-CSharp-Editor-firstpass-vs.csproj - Assembly-CSharp-Edit..> 
Assembly-CSharp-Editor-firstpass.csproj - Assembly-CSharp-Edit..> 
Assembly-CSharp-Editor-firstpass.pidb - Assembly-CSharp-Edit..> 
Assembly-CSharp-firstpass-vs.csproj - Assembly-CSharp-firs..> 
Assembly-CSharp-firstpass.csproj - Assembly-CSharp-firs..> 
Assembly-CSharp-firstpass.pidb - Assembly-CSharp-firs..> 
Assembly-CSharp-vs.csproj - Assembly-CSharp-vs.c..> 
Assembly-CSharp.csproj - Assembly-CSharp.csproj 
Assembly-CSharp.pidb - Assembly-CSharp.pidb 
Assembly-UnityScript-Editor-firstpass-vs.unityproj - Assembly-UnityScript..> 
Assembly-UnityScript-Editor-firstpass.pidb - Assembly-UnityScript..> 
Assembly-UnityScript-Editor-firstpass.unityproj - Assembly-UnityScript..> 
Assembly-UnityScript-firstpass-vs.unityproj - Assembly-UnityScript..> 
Assembly-UnityScript-firstpass.pidb - Assembly-UnityScript..> 
Assembly-UnityScript-firstpass.unityproj - Assembly-UnityScript..> 
Assembly-UnityScript-vs.unityproj - Assembly-UnityScript..> 
Assembly-UnityScript.pidb - Assembly-UnityScript..> 
Assembly-UnityScript.unityproj - Assembly-UnityScript..> 
Assets/ - Assets/ 
Library/ - Library/ 
Professor%20Phys-csharp.sln - Professor Phys-cshar..> 
Professor%20Phys.exe - Professor Phys.exe 
Professor%20Phys.sln - Professor Phys.sln 
Professor%20Phys.userprefs - Professor Phys.userp..> 
Professor%20Phys_Data/ - Professor Phys_Data/ 
Script.doc - Script.doc 
~$Script.doc - ~$Script.doc 
~WRL0392.tmp - ~WRL0392.tmp 
~WRL1966.tmp - ~WRL1966.tmp 

Sau đó bạn sẽ cần phải xây dựng một URL mới cho mỗi tập tin và đọc khi bạn đã thực hiện ...

Ví dụ, href cho Assembly-CSharp-Edit..>Assembly-CSharp-Editor-firstpass-vs.csproj, mà dường như một liên kết tương đối, do đó bạn sẽ cần thêm tiền tố này với http://www.futureretrogaming.tk/gamefiles/ProfessorPhys để thực hiện một mới URL của http://www.futureretrogaming.tk/gamefiles/ProfessorPhys/Assembly-CSharp-Editor-firstpass-vs.csproj

bạn sẽ cần phải làm điều này cho mỗi yếu tố bạn muốn lấy

+0

Cảm ơn. Tôi sẽ thực sự nhìn vào điều này! – Kyle

+0

Y phải yêu thích phiếu giảm giá. Xin vui lòng có can đảm để cung cấp một số phản hồi để tang tất cả chúng ta có thể học hỏi từ những sai lầm và có cơ hội để cải thiện câu trả lời – MadProgrammer

+0

@MadProgrammer Xin lỗi vì người khiếm thị, tôi nên giải thích: Để bắt đầu, mã hàng đầu của bạn sẽ không hoạt động vì lý do gì. Tôi không bận tâm kiểm tra tất cả mọi thứ, nhưng nó sẽ không hoạt động. Thứ hai, JSoup thêm vào một sự phụ thuộc - Cá nhân tôi nghĩ là không cần thiết và lộn xộn. Và ngoài ra, bạn mong đợi rằng đầu ra, nhưng không nhận ra rằng đầu ra là khác nhau bằng cách sử dụng các ứng dụng hiển thị web khác nhau (ví dụ: apache/ngix/etc). Cuối cùng, tôi tải xuống "download.txt", lặp lại thông qua các chuỗi trong tệp đó và tải xuống chúng. Tôi chỉ tìm thấy bài đăng của bạn không quan trọng, là tất cả. – Joehot200

0

Bạn đã xem là công cụ như HTTrack, nó có thể phát hiện sự hiện diện của thẻ neo trên HTML và tải toàn bộ trang web (giới hạn bởi mức cây). Bạn cũng có thể chỉ định bộ lọc những tệp nào sẽ được tải xuống vv

Nếu điều này không phù hợp với yêu cầu của bạn, bạn vẫn có thể sử dụng chương trình Java viết tay, ngoại trừ sự cố có được danh sách tệp trong URL (và tất cả thư mục con trong). Bạn cần phân tích cú pháp HTML, thu thập tất cả các thẻ neo và duyệt qua (đó là những gì HTTrack đang làm)

+0

Cảm ơn bài đăng, đó là một phần mềm khác. – Kyle

+0

Tôi đã chỉnh sửa câu hỏi của mình để đưa thêm mã. – Kyle

Các vấn đề liên quan