2013-04-14 10 views
6

Tôi cần một hàm rất đơn giản cho phép tôi đọc 1k byte đầu tiên của tệp qua FTP. Tôi muốn sử dụng nó trong MATLAB để đọc các dòng đầu tiên và, theo một số tham số, để tải về chỉ các tập tin tôi thực sự cần cuối cùng. Tôi tìm thấy một số ví dụ trực tuyến mà tiếc là không hoạt động. Ở đây tôi đang đề xuất mã mẫu mà tôi đang cố tải xuống một tệp duy nhất (tôi đang sử dụng thư viện Apache).Đọc các byte đầu tiên của một tệp

FTPClient client = new FTPClient(); 
    FileOutputStream fos = null; 

    try { 
     client.connect("data.site.org"); 

     // filename to be downloaded. 
     String filename = "filename.Z"; 
     fos = new FileOutputStream(filename); 

     // Download file from FTP server 
     InputStream stream = client.retrieveFileStream("/pub/obs/2008/021/ab120210.08d.Z"); 
     byte[] b = new byte[1024]; 
     stream.read(b); 
     fos.write(b); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fos != null) { 
       fos.close(); 
      } 
      client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

lỗi trong luồng được trả về trống. Tôi biết tôi đang đi qua tên thư mục một cách sai lầm, nhưng tôi không thể hiểu làm thế nào tôi phải làm. Tôi đã cố gắng theo nhiều cách.

Tôi cũng đã thử với các lớp Java của URL như:

URL url; 

    url = new URL("ftp://data.site.org/pub/obs/2008/021/ab120210.08d.Z"); 

    URLConnection con = url.openConnection(); 
    BufferedInputStream in = 
      new BufferedInputStream(con.getInputStream()); 
    FileOutputStream out = 
      new FileOutputStream("C:\\filename.Z"); 

    int i; 
    byte[] bytesIn = new byte[1024]; 
    if ((i = in.read(bytesIn)) >= 0) { 
     out.write(bytesIn); 
    } 
    out.close(); 
    in.close(); 

nhưng nó được đưa ra một lỗi khi tôi đang đóng InputStream trong!

Tôi chắc chắn bị kẹt. Một số ý kiến ​​về sẽ rất hữu ích!

+0

Chào mừng bạn đến Stackoverflow! Không cần phải thêm thẻ vào tiêu đề của bạn, có một hệ thống thẻ cho điều đó. Vui lòng đọc http://meta.stackexchange.com/q/19190/147072 để biết thêm thông tin. Ngoài ra, bạn không cần phải thêm "Cảm ơn" hoặc tên của bạn ở cuối, mọi người đều biết ơn sự giúp đỡ và tên của bạn được hiển thị trong bảng ký tự của bạn ở góc dưới cùng bên phải của mỗi câu hỏi và câu trả lời bạn tạo. – Patrick

Trả lời

1

Hãy thử kiểm tra này

InputStream is = new URL("ftp://test:[email protected]/bookstore.xml").openStream(); 
    byte[] a = new byte[1000]; 
    int n = is.read(a); 
    is.close(); 
    System.out.println(new String(a, 0, n)); 

nó chắc chắn công trình

+0

Xin chào, mã chỉ hoạt động nếu toàn bộ tệp được tải xuống. Tôi đã thêm hai dòng nơi tôi lưu trữ dữ liệu trong một tệp đầu ra trong ổ đĩa cục bộ của mình. Khi tôi chạy mã từ MATLAB nó tải các tập tin (tôi có thể nhìn thấy nó trên thư mục và tôi có thể mở nó) nhưng nó bị mắc kẹt trên dòng nơi kết nối đầu vào được đóng lại (is.close()). Nếu tôi xóa dòng nó hoạt động. Vấn đề là tôi không biết làm thế nào được quản lý kết nối và tôi muốn tránh để giữ cho các cổng mở không có lý do. Điều cuối cùng. Nếu tôi tải về tất cả các tập tin, is.close() hoạt động tốt! Đây là điều khiến tôi phát điên :). – user2279697

-1

Tôi không thể hiểu tại sao nó không hoạt động. Tôi tìm thấy điều này link nơi họ sử dụng thư viện Apache để đọc 4096 byte mỗi lần. Tôi đọc 1024 byte đầu tiên và nó hoạt động cuối cùng, điều duy nhất là nếu completePendingCommand() được sử dụng, chương trình được giữ lại mãi mãi. Vì vậy, tôi đã gỡ bỏ nó và mọi thứ hoạt động tốt.

0

Từ kinh nghiệm của tôi khi bạn đọc byte từ một luồng có được từ ftpClient.retrieveFileStream, lần đầu tiên nó không được bảo đảm rằng bạn nhận được bộ đệm byte đầy. Tuy nhiên, một trong hai bạn nên đọc các giá trị trở lại của stream.read(b); bao quanh với một chu kỳ dựa trên nó hoặc sử dụng một thư viện tiên tiến để lấp đầy 1024 chiều dài byte [] buffer:

InputStream stream = null; 
try { 
    // Download file from FTP server 
    stream = client.retrieveFileStream("/pub/obs/2008/021/ab120210.08d.Z"); 
    byte[] b = new byte[1024]; 
    IOUtils.read(stream, b); // will call periodically stream.read() until it fills up your buffer or reaches end-of-file 
    fos.write(b); 

} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    IOUtils.closeQuietly(inputStream); 
}