2012-04-06 7 views
30

Androidアプリケーションでファイルコンテンツをバイト単位で取得しようとしています。選択したファイルをバイト単位で取得したいと思っています。私はグーグルではなく、そのような成功はありません。助けてくださいAndroid:ファイルをバイト単位で読み取るには?

以下は、拡張子を持つファイルを取得するためのコードです。これを介して私はファイルを取得し、スピナーに表示します。ファイルを選択する際、ファイルをバイト単位で取得したい。

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; 
} 

答えて

73

ここでは簡単です:

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(); 
} 

はのmanifest.xmlに許可を追加します。ここでは

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

注意を行います。以下のjavadocを参照してください。http://docs.oracle.com/javase/6/docs/api/java/io/BufferedInputStream.html#read(byte []、int、int) – vaughandroid

+1

CoolMind

+0

FileInputStreamを1回のヒットで読み込む場合は、FileInputStreamをBufferedInputStreamにラップする必要はありません。これにより、データが不必要にコピーされるため、メモリが増え、処理が遅くなります。 – Clyde

14

は何のライブラリを必要としないこと、ファイル全体を保証ソリューションが読み込まれますし、効率的です:

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; 
} 

注:ファイルサイズがMAX_INTバイト未満であることを前提としていますが、必要に応じて処理を追加できます。

+1

ありがとうございました。 'jsonFile'を 'f'に置き換えます。 – CoolMind

+0

バッファサイズとファイルサイズを "size"という同じ名前で呼び出すと、非常に混乱します。この方法では、ファイルサイズのバッファサイズがバッファを持たず、ループは実行されません。 – FlorianB

+0

@FlorianBループが決して実行されないことが期待されます。最良の場合のシナリオでは、 'fis.read(bytes、0、size);'の最初の呼び出しでファイル全体が読み込まれます。...ファイルが大きすぎてシステムが 'ファイル全体を読み込みます。この場合、fis.read()を連続して呼び出してループを開始し、残りの部分を読み込みます。 file.read()は、要求されたすべてのバイトが1回の呼び出しで読み取られることを保証せず、戻り値は実際に読み取られたバイト数です。 – Siavash

0

あなたまた、それをこのように行うことができます。

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

ブロックまで:受け入れBufferedInputStream#read以来

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

をむしろバッファのサイズは自分を追跡するよりも、すべてのものを読むことを保証するものではありません、私はこのアプローチを使用しました完全な読み込みが完了し、余分な読み込みは必要ありません。

+0

Disは本当に私を多く助けました –

0

シンプルInputStreamが `buf.read()`あなたが要求したバイト数を読んでいないことを

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; 
} 
関連する問題