Android: как прочитать файл в байтах?

Я пытаюсь получить содержимое файла в байтах в приложении Android. Я получил файл на SD-карте, теперь хочу получить выбранный файл в байтах. Я гуглил, но успеха не было. Пожалуйста помоги

Ниже приведен код для получения файлов с расширением. Благодаря этому я получаю файлы и показываю на счетчике. При выборе файла я хочу получить файл в байтах.

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

Ответы на вопрос(7)

Ниже приводится рабочее решение для чтения всего файла блоками и его эффективное решение для чтения больших файлов с использованием класса сканера.

   try {
        FileInputStream fiStream = new FileInputStream(inputFile_name);
        Scanner sc = null;
        try {
            sc = new Scanner(fiStream);
            while (sc.hasNextLine()) {
                String line = sc.nextLine();
                byte[] buf = line.getBytes();
            }
        } finally {
            if (fiStream != null) {
                fiStream.close();
            }

            if (sc != null) {
                sc.close();
            }
        }
    }catch (Exception e){
        Log.e(TAG, "Exception: " + e.toString());
    }
Решение Вопроса

здесь все просто:

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" />
 02 мая 2017 г., 21:24
@JamesKPolk как насчет ответа Сиаваша? Это правильно?
 27 апр. 2016 г., 18:28
Не забудьте & lt; использует-разрешение android: name = & quot; android.permission.READ_EXTERNAL_STORAGE & quot; / & GT; в манифесте.
 05 сент. 2013 г., 11:33
Обратите внимание, чтоbuf.read() может не прочитать количество байтов, которые вы запрашиваете. Смотрите Javadoc здесь:docs.oracle.com/javase/6/docs/api/java/io/…, int, int)
 02 апр. 2017 г., 20:17
Этот ответ на самом деле неверен, как отмечает первый комментарий, несмотря на его высокую репутацию и несмотря на то, что его приняли. Это, к сожалению, темная сторона stackoverflow.
 14 мар. 2017 г., 02:54
Если вы собираетесь прочитать весь файл за одно нажатие, нет необходимости заключать FileInputStream в BufferedInputStream - это означает, что использование большего объема памяти замедлит работу, поскольку данные будут скопированы без необходимости.

Самым простым решением сегодня является использование Apache common io:

http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.html#readFileToByteArray(java.io.File)

byte bytes[] = FileUtils.readFileToByteArray(photoFile)

Единственным недостатком является добавление этой зависимости в вашbuild.gradle приложение:

implementation 'commons-io:commons-io:2.5'

+ 1562 Кол-во методов

Вы также можете сделать это следующим образом:

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

Так как принятоBufferedInputStream#read Не гарантируется, что все будет прочитано, вместо того, чтобы самостоятельно отслеживать размеры буфера, я использовал этот подход:

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

Блокирует, пока полное чтение не завершено, и не требует дополнительного импорта.

 17 апр. 2018 г., 14:51
ПочемуBufferedInputStream#read<,/code> is not guaranteed to read everything? I read the docs and didn't found anything about this 'problem'.
 10 авг. 2017 г., 17:12
Дис действительно помог мне

Вот решение, гарантирующее чтение всего файла, которое не требует библиотек и является эффективным:

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, вы можете добавить обработку для этого, если хотите.

 27 апр. 2016 г., 17:29
Благодарю. Заменить "jsonFile" с 'f'.
 14 мар. 2017 г., 08:20
@FlorianB Надежда в том, что цикл никогда не будет выполнен. в лучшем случае весь файл будет прочитан при первом вызовеfis.read(bytes, 0, size);... цикл существует только в случае, если файл слишком велик, и система не читает весь файл, и в этом случае мы входим в цикл и читаем остальное в последовательных вызовах fis.read (). file.read () не гарантирует, что все запрошенные у него байты могут быть прочитаны за один вызов, а возвращаемое значение равно количеству байтов, которые фактически прочитаны.
 29 нояб. 2016 г., 01:17
Вы сильно путаетесь, называя размер буфера и размер файла одним и тем же именем: & quot; размер & quot ;. Таким образом, вы получите размер буфера размером с файл, что означает отсутствие буфера, ваш цикл никогда не будет выполнен.

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

Ваш ответ на вопрос