2012-04-06 10 views
30

Ich versuche, Dateiinhalt in Bytes in Android-Anwendung zu erhalten. Ich habe jetzt die Datei in SD-Karte bekommen wollen, um die ausgewählte Datei in Bytes zu bekommen. Ich googelte aber keinen solchen Erfolg. Bitte helfen SieAndroid: Wie liest man eine Datei in Bytes?

Unten ist der Code, um Dateien mit der Erweiterung zu erhalten. Dadurch bekomme ich Dateien und zeige in Spinner. Bei Dateiauswahl möchte ich Datei in Bytes bekommen.

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

Antwort

73

hier ist es eine einfache:

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

hinzufügen Erlaubnis in manifest.xml:

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

Hinweis tun, dass 'buf.read()' kann die Anzahl von Bytes nicht lesen Sie anfordern. Sehen Sie sich das Javadoc hier an: http://docs.oracle.com/javase/6/docs/api/java/io/BufferedInputStream.html#read (byte [], int, int) – vaughandroid

+1

im Manifest. – CoolMind

+0

Wenn Sie die gesamte Datei mit nur einem Treffer lesen möchten, müssen Sie den FileInputStream nicht in einen BufferedInputStream umbrechen. Dies führt zu mehr Speicher und verlangsamt die Daten, da die Daten unnötigerweise kopiert werden. – Clyde

14

Hier ist eine Lösung, die gesamte Datei garantiert gelesen werden, dass keine Bibliotheken erfordert und ist effizient:

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

HINWEIS: Es wird davon ausgegangen, dass die Dateigröße weniger als MAX_INT Bytes beträgt. Falls gewünscht, können Sie eine Behandlung hinzufügen.

+1

Danke. Ersetzen Sie "jsonFile" durch "f". – CoolMind

+0

Sie machen es sehr verwirrend, indem Sie die Puffergröße und die Dateigröße mit dem gleichen Namen aufrufen: "Größe". Auf diese Weise haben Sie eine Puffergröße der Größe der Datei, die keinen Puffer bedeutet, Ihre Schleife wird nie ausgeführt. – FlorianB

+0

@FlorianB Die Hoffnung ist, dass die Schleife nie ausgeführt wird. im besten Fall wird beim ersten Aufruf von 'fis.read (Bytes, 0, size) die gesamte Datei gelesen;' ... die Schleife ist da, falls die Datei zu groß ist und das System nicht ' t lese die ganze Datei, in diesem Fall betreten wir die Schleife und lesen den Rest in aufeinanderfolgenden Aufrufen von fis.read(). file.read() garantiert nicht, dass alle angeforderten Bytes in einem Aufruf gelesen werden können, und der Rückgabewert ist die Anzahl der tatsächlich gelesenen Bytes. – Siavash

0

Sie kann es auch auf diese Weise tun:

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

Seit den akzeptierten BufferedInputStream#read nicht lesen alles garantiert, anstatt Spur des Puffers zu halten Größen selbst, habe ich diesen Ansatz:

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

Blöcke bis Ein vollständiger Lesevorgang ist abgeschlossen und erfordert keine zusätzlichen Importe.

+0

Dis hat mir wirklich sehr geholfen –

0

wird ein einfaches Input

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