2015-05-20 11 views
7

Tôi biết làm thế nào để sử dụng AssetManager để đọc một File từ thư mục res/raw với một InputStream, nhưng đối với trường hợp sử dụng đặc biệt của tôi, tôi cần một FileInputStream. Lý do tôi cần một số FileInputStream đặc biệt là vì tôi cần lấy đối tượng FileChannel từ nó bằng cách gọi getChannel().Làm thế nào để có được FileInputStream File trong thư mục tài sản

Đây là mã tôi có cho đến nay, nó đọc dữ liệu (trong trường hợp của tôi một danh sách các nguyên thủy) từ một File:

public static int[] loadByMappedBuffer(Context context, String filename) throws IOException{ 
    FileInputStream fis = context.openFileInput(filename); 
    FileChannel ch = fis.getChannel(); 

    MappedByteBuffer mbuff = ch.map(MapMode.READ_ONLY, 0, ch.size()); 
    IntBuffer ibuff = mbuff.asIntBuffer(); 

    int[] array = new int[ibuff.limit()]; 
    ibuff.get(array); 

    fis.close(); 
    ch.close(); 

    return array; 
} 

Tôi đã cố gắng để tạo ra File từ một Uri, nhưng điều đó chỉ kết quả trong một FileNotFoundException:

Uri uri = Uri.parse("android.resource://com.example.empty/raw/file"); 
File file = new File(uri.getPath()); 
FileInputStream fis = new FileInputStream(file); 

có cách nào tôi có thể nhận được một FileInputStream đến một File trong thư mục res/raw?

+0

Tôi nghĩ rằng URL của bạn là problem.And bạn nên thêm từ thư mục tài sản. –

+0

Vì vậy, tất cả những gì bạn cần là đọc nội dung tập tin dưới dạng mảng int? Tôi có đúng không? – Ayzen

+0

@Ayzen có, nhưng tôi cần phải làm cho nó nhanh chóng, phương pháp, mà tôi đã đọc 80K * 4 byte và chuyển nó thành int mảng 6-7 ms trên máy tính của tôi –

Trả lời

9

Bạn có thể có được một FileInputStream tới tài nguyên trong tài sản của bạn như thế này:

AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName); 
FileInputStream stream = fileDescriptor.createInputStream(); 

Các fileName bạn cung cấp cho openFd() nên là đường dẫn tương đối với tài sản, cùng fileName bạn sẽ cung cấp cho open().

Hoặc bạn cũng có thể tạo các FileInputStream như thế này:

AssetFileDescriptor assetFileDescriptor = assetManager.openFd(fileName); 
FileDescriptor fileDescriptor = assetFileDescriptor.getFileDescriptor(); 
FileInputStream stream = new FileInputStream(fileDescriptor); 
Các vấn đề liên quan