Android: Как читать файл в байтах?
Я пытаюсь получить содержимое файла в байтах в приложении Android. Я получил файл на SD-карте, теперь хочу получить выбранный файл в байтах. Я googled, но такого успеха нет. Пожалуйста, помогите
Ниже приведен код для получения файлов с расширением. Через это я получаю файлы и показываю в spinner. При выборе файла я хочу получить файл в байтах.
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;
}
Ответы
Ответ 1
здесь это просто:
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" />
Ответ 2
Вот решение, которое гарантирует, что весь файл будет считан, который не требует библиотек и эффективен:
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, вы можете добавить к нему обработку, если хотите.
Ответ 3
Самое простое решение сегодня - использовать 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
:
compile 'commons-io:commons-io:2.4'
+ 1562 Количество методов
Ответ 4
Поскольку принятому BufferedInputStream#read
не гарантировано читать все, а не отслеживать размеры буфера, я использовал этот подход:
byte bytes[] = new byte[(int) file.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
DataInputStream dis = new DataInputStream(bis);
dis.readFully(bytes);
Блокирует до полного завершения чтения и не требует дополнительных импортов.
Ответ 5
Вы также можете сделать это следующим образом:
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;
}
Ответ 6
Простой InputStream будет выполнять
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;
}