2012-04-06 34 views
30

Tôi đang cố tải nội dung tệp theo byte trong ứng dụng Android. Tôi đã nhận được tập tin trong thẻ SD bây giờ muốn để có được các tập tin được chọn theo byte. Tôi googled nhưng không thành công như vậy. Vui lòng giúpAndroid: Cách đọc tệp theo byte?

Dưới đây là mã để nhận tệp có phần mở rộng. Thông qua này tôi nhận được các tập tin và hiển thị trong spinner. Khi chọn tệp, tôi muốn nhận tệp theo byte.

private List<String> getListOfFiles(String path) { 

    File files = new File(path); 

    FileFilter filter = new FileFilter() { 

     private final List<String> exts = Arrays.asList("jpeg", "jpg", "png", "bmp", "gif","mp3"); 

     public boolean accept(File pathname) { 
     String ext; 
     String path = pathname.getPath(); 
     ext = path.substring(path.lastIndexOf(".") + 1); 
     return exts.contains(ext); 
     } 
    }; 

    final File [] filesFound = files.listFiles(filter); 
    List<String> list = new ArrayList<String>(); 
    if (filesFound != null && filesFound.length > 0) { 
     for (File file : filesFound) { 
     list.add(file.getName()); 
     } 
    } 
    return list; 
} 

Trả lời

73

đây đó là một đơn giản:

File file = new File(path); 
int size = (int) file.length(); 
byte[] bytes = new byte[size]; 
try { 
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file)); 
    buf.read(bytes, 0, bytes.length); 
    buf.close(); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Thêm sự cho phép trong manifest.xml:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
+6

Lưu ý rằng 'buf.read()' có thể không đọc số byte quý vị yêu cầu. Xem javadoc tại đây: http://docs.oracle.com/javase/6/docs/api/java/io/BufferedInputStream.html#read (byte [], int, int) – vaughandroid

+1

Đừng quên trong tệp kê khai. – CoolMind

+0

Nếu bạn đọc toàn bộ tập tin trong một lần truy cập, không cần phải gói FileInputStream trong BufferedInputStream -indeed để làm như vậy sẽ sử dụng nhiều bộ nhớ hơn và làm chậm những thứ xuống vì dữ liệu sẽ được sao chép không cần thiết. – Clyde

14

Đây là một giải pháp mà đảm bảo toàn bộ tập tin sẽ được đọc, mà không đòi hỏi các thư viện và là hiệu quả:

byte[] fullyReadFileToBytes(File f) throws IOException { 
    int size = (int) f.length(); 
    byte bytes[] = new byte[size]; 
    byte tmpBuff[] = new byte[size]; 
    FileInputStream fis= new FileInputStream(f);; 
    try { 

     int read = fis.read(bytes, 0, size); 
     if (read < size) { 
      int remain = size - read; 
      while (remain > 0) { 
       read = fis.read(tmpBuff, 0, remain); 
       System.arraycopy(tmpBuff, 0, bytes, size - remain, read); 
       remain -= read; 
      } 
     } 
    } catch (IOException e){ 
     throw e; 
    } finally { 
     fis.close(); 
    } 

    return bytes; 
} 

LƯU Ý: nó giả định kích thước tập tin nhỏ hơn MAX_INT byte, bạn có thể thêm xử lý cho điều đó nếu bạn muốn.

+1

Cảm ơn. Thay thế 'jsonFile' bằng 'f'. – CoolMind

+0

Bạn làm cho nó rất khó hiểu bằng cách gọi kích thước bộ đệm và kích thước tập tin bằng cùng một tên: "kích thước". Bằng cách này, bạn sẽ có kích thước bộ đệm kích thước của tệp có nghĩa là không có bộ đệm, vòng lặp của bạn sẽ không bao giờ được thực hiện. – FlorianB

+0

@FlorianB Hy vọng rằng vòng lặp không bao giờ được thực hiện. trong trường hợp tốt nhất, toàn bộ tập tin sẽ được đọc trong lần gọi đầu tiên tới 'fis.read (byte, 0, size);' ... vòng lặp chỉ có trong trường hợp tệp quá lớn và hệ thống không hoạt động ' t đọc toàn bộ tập tin, trong trường hợp đó chúng ta nhập vòng lặp và đọc phần còn lại trong các cuộc gọi liên tiếp đến fis.read(). file.read() không đảm bảo rằng tất cả các byte được yêu cầu của nó có thể được đọc trong một cuộc gọi, và giá trị trả về là số byte thực sự đọc. – Siavash

0

Bạn cũng có thể làm theo cách này:

byte[] getBytes (File file) 
{ 
    FileInputStream input = null; 
    if (file.exists()) try 
    { 
     input = new FileInputStream (file); 
     int len = (int) file.length(); 
     byte[] data = new byte[len]; 
     int count, total = 0; 
     while ((count = input.read (data, total, len - total)) > 0) total += count; 
     return data; 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
    finally 
    { 
     if (input != null) try 
     { 
      input.close(); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    return null; 
} 
5

Kể từ khi chấp nhận BufferedInputStream#read không được bảo đảm để đọc tất cả mọi thứ, chứ không phải là theo dõi các bộ đệm kích thước bản thân mình, tôi đã sử dụng phương pháp này:

byte bytes[] = new byte[(int) file.length()]; 
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 
    DataInputStream dis = new DataInputStream(bis); 
    dis.readFully(bytes); 

Blocks cho đến khi đọc đầy đủ đã hoàn tất và không yêu cầu nhập thêm.

+0

Dis thực sự đã giúp tôi rất nhiều –

0

Một InputStream đơn giản sẽ làm

byte[] fileToBytes(File file){ 
    byte[] bytes = new byte[0]; 
    try(FileInputStream inputStream = new FileInputStream(file)) { 
     bytes = new byte[inputStream.available()]; 
     //noinspection ResultOfMethodCallIgnored 
     inputStream.read(bytes); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return bytes; 
} 
Các vấn đề liên quan