Элегантный способ чтения файла в массив byte[] в Java [дубликат]
Возможные Дубликаты:
File to byte[] в Java
Я хочу прочитать данные из файла и распаковать его в посылку. В документации не ясно, что FileInputStream имеет метод для чтения всего его содержимого. Чтобы реализовать это, я делаю следующее:
FileInputStream filein = context.openFileInput(FILENAME);
int read = 0;
int offset = 0;
int chunk_size = 1024;
int total_size = 0;
ArrayList<byte[]> chunks = new ArrayList<byte[]>();
chunks.add(new byte[chunk_size]);
//first I read data from file chunk by chunk
while ( (read = filein.read(chunks.get(chunks.size()-1), offset, buffer_size)) != -1) {
total_size+=read;
if (read == buffer_size) {
chunks.add(new byte[buffer_size]);
}
}
int index = 0;
// then I create big buffer
byte[] rawdata = new byte[total_size];
// then I copy data from every chunk in this buffer
for (byte [] chunk: chunks) {
for (byte bt : chunk) {
index += 0;
rawdata[index] = bt;
if (index >= total_size) break;
}
if (index>= total_size) break;
}
// and clear chunks array
chunks.clear();
// finally I can unmarshall this data to Parcel
Parcel parcel = Parcel.obtain();
parcel.unmarshall(rawdata,0,rawdata.length);
Я думаю, что этот код выглядит некрасиво, и на мой вопрос: Как сделать чтение данных из файла в байт[] красиво? :)
6 ответов:
давным-давно:
назовите любой из них
byte[] org.apache.commons.io.FileUtils.readFileToByteArray(File file) byte[] org.apache.commons.io.IOUtils.toByteArray(InputStream input)
С
если размер библиотеки слишком велик для вашего приложения для Android, вы можете просто использовать соответствующие классы из библиотеки commons-io
сегодня (Java 7+ или Android API Level 26+)
к счастью, теперь у нас есть несколько удобных методов в пакетах nio. Для пример:
byte[] java.nio.file.Files.readAllBytes(Path path)
Это также будет работать:
import java.io.*; public class IOUtil { public static byte[] readFile(String file) throws IOException { return readFile(new File(file)); } public static byte[] readFile(File file) throws IOException { // Open file RandomAccessFile f = new RandomAccessFile(file, "r"); try { // Get and check length long longlength = f.length(); int length = (int) longlength; if (length != longlength) throw new IOException("File size >= 2 GB"); // Read file and return data byte[] data = new byte[length]; f.readFully(data); return data; } finally { f.close(); } } }
Если вы используете Google Guava (и если вы этого не сделаете, вы должны), вы можете по телефонам:
ByteStreams.toByteArray(InputStream)
илиFiles.toByteArray(File)
это работает для меня:
File file = ...; byte[] data = new byte[(int) file.length()]; try { new FileInputStream(file).read(data); } catch (Exception e) { e.printStackTrace(); }
использовать
ByteArrayOutputStream
. Вот этот процесс:
- получить
InputStream
для чтения данных- создать
ByteArrayOutputStream
.- скопировать все
InputStream
наOutputStream
- получите ваш
byte[]
СByteArrayOutputStream
с помощьюtoByteArray()
метод