Java 中将文件读入 byte []数组的优雅方法

可能的复制品:
在 Java 中将文件转换为 byte []

我想从文件中读取数据并将其解组到 Parcel。 在文档中并不清楚 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);

我认为这个代码看起来很丑陋,我的问题是: 如何完美地将数据从文件读取到字节[] ? :)

173253 次浏览

使用 ByteArrayOutputStream,过程如下:

  • 获取 InputStream来读取数据
  • 创建一个 ByteArrayOutputStream
  • 将所有的 InputStream复制到 OutputStream
  • 使用 toByteArray()方法从 ByteArrayOutputStream获取 byte[]

很久以前:

随便叫一个

byte[] org.apache.commons.io.FileUtils.readFileToByteArray(File file)
byte[] org.apache.commons.io.IOUtils.toByteArray(InputStream input)

Http://commons.apache.org/io/

如果库占用对于您的 Android 应用程序来说太大,您可以只使用 commons-io 库中的相关类

今天(Java7 + 或 Android API 级别26 +)

幸运的是,我们现在在 nio 包中有一些方便的方法,例如:

byte[] java.nio.file.Files.readAllBytes(Path path)

我是 Javadoc

看看下面的 apache commons 函数:

org.apache.commons.io.FileUtils.readFileToByteArray(File)

如果使用 谷歌番石榴(如果不使用,则应该使用) ,可以调用: ByteStreams.toByteArray(InputStream)Files.toByteArray(File)

这也会奏效:

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

这对我有用:

File file = ...;
byte[] data = new byte[(int) file.length()];
try {
new FileInputStream(file).read(data);
} catch (Exception e) {
e.printStackTrace();
}