2012-05-01 36 views
16

Tôi có tệp văn bản trong thư mục nội dung mà tôi cần chuyển thành đối tượng Tệp (không phải vào InputStream). Khi tôi thử điều này, tôi có ngoại lệ "không có tệp như vậy":Android: làm cách nào để tạo đối tượng Tệp từ tệp nội dung?

String path = "file:///android_asset/datafile.txt"; 
URL url = new URL(path); 
File file = new File(url.toURI()); // Get exception here 

Tôi có thể sửa đổi điều này để làm việc này không?

Bằng cách này, tôi loại đã cố gắng để "mã bằng ví dụ" nhìn vào đoạn mã sau ở nơi khác trong dự án của tôi tham chiếu đến một tập tin HTML trong thư mục nội dung

public static Dialog doDialog(final Context context) { 
WebView wv = new WebView(context);  
wv.loadUrl("file:///android_asset/help/index.html"); 

tôi làm thừa nhận rằng tôi không hoàn toàn hiểu được cơ chế trên vì vậy có thể những gì tôi đang cố gắng làm không thể hoạt động.

Thx!

+0

Tại sao bạn muốn đọc nó vào một đối tượng File? Tôi tin rằng bạn cần lấy dữ liệu từ nội dung dưới dạng InputStream và viết nó ra dưới dạng outputStream trỏ đến một vị trí thực. Sau đó, bạn có thể mở nó như là một đối tượng File. http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard – Gophermofur

+0

Tôi đang cố gắng tránh tạo bản sao của tệp nội dung, nhưng tôi sẽ làm điều đó nếu tất cả khác thất bại. Lý do tôi cần một tập tin là nó được sử dụng như một đối số trong một ctor có mã tôi không có quyền truy cập vào, và đó là ctor duy nhất tồn tại cho lớp đó. –

+0

Ah, điều đó có ý nghĩa. Có thể: Tạo bản sao vào SDCARD, chuyển nó vào \ tới hàm tạo và xóa nó sau khi bạn đã hoàn thành? Nếu tập tin là như nhau và bạn luôn luôn lưu nó vào cùng một vị trí trên SDCARD bạn chỉ muốn thực hiện 1 bản sao (nó sẽ chỉ ghi đè lên phiên bản trước đó). – Gophermofur

Trả lời

23

Bạn không thể nhận đối tượng File trực tiếp từ nội dung vì nội dung không được lưu trữ dưới dạng tệp. Bạn sẽ cần sao chép nội dung vào tệp, sau đó nhận đối tượng File trên bản sao của bạn.

+6

Vâng, bạn có thể làm như thế nào? –

+0

@MarkMolina: Xem câu trả lời khác. Nó khá giống với Java I/O chuẩn, sử dụng 'InputStream' từ phương thức' open() 'trên' AssetManager', sau đó sao chép dữ liệu từ 'InputStream' sang' OutputStream' cho tệp mong muốn của bạn. – CommonsWare

8

Bạn không thể nhận đối tượng Tệp trực tiếp từ nội dung.

Thứ nhất, nhận được một InputStream từ tài sản của bạn sử dụng ví dụ AssetManager#open

Sau đó sao chép các InputStream:

public static void writeBytesToFile(InputStream is, File file) throws IOException{ 
    FileOutputStream fos = null; 
    try { 
     byte[] data = new byte[2048]; 
     int nbread = 0; 
     fos = new FileOutputStream(file); 
     while((nbread=is.read(data))>-1){ 
      fos.write(data,0,nbread);    
     } 
    } 
    catch (Exception ex) { 
     logger.error("Exception",ex); 
    } 
    finally{ 
     if (fos!=null){ 
      fos.close(); 
     } 
    } 
} 
0

Chức năng này mất tích trong mã. @wadali

private void copyFile(InputStream in, OutputStream out) throws IOException { 
    byte[] buffer = new byte[1024]; 
    int read; 
    while((read = in.read(buffer)) != -1){ 
     out.write(buffer, 0, read); 
    } 
} 

Nguồn: https://stackoverflow.com/a/4530294/4933464

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