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

Ars*_*niy 70 java file-io android file

可能重复:
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);
Run Code Online (Sandbox Code Playgroud)

我认为这段代码看起来很丑陋,我的问题是:如何将文件中的数据读取到byte []中?:)

Luk*_*der 138

很久以前:

打电话给任何一个

byte[] org.apache.commons.io.FileUtils.readFileToByteArray(File file)
byte[] org.apache.commons.io.IOUtils.toByteArray(InputStream input) 
Run Code Online (Sandbox Code Playgroud)

http://commons.apache.org/io/

如果您的Android应用程序的库占用空间太大,您可以使用commons-io库中的相关类

今天(Java 7+或Android API Level 26+)

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

byte[] java.nio.file.Files.readAllBytes(Path path)
Run Code Online (Sandbox Code Playgroud)

Javadoc在这里

  • +1 - `IOUtils.toByteArray(InputStream)`也可以工作,虽然`FileUtils`方法应该更有效. (10认同)
  • 如何在Android中做同样的事情?在Andorid中没有byte [] java.nio.file.Files.readAllBytes(路径路径)..?有任何想法吗..? (4认同)

小智 62

这也有效:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1不添加lib. (12认同)

Pet*_*aný 37

如果你使用谷歌番石榴(如果你不这样做,你应该),你可以打电话:ByteStreams.toByteArray(InputStream)Files.toByteArray(File)

  • @Tom几乎是对的.默认情况下不会删除它,但如果您设置了Proguard,它将删除所有未使用的代码.Guava默认在写入APK时增加大约2.2MB.但是使用Proguard它只增加了大约250KB. (3认同)
  • 但是 guava jar 是 1.6mb,这对于 Android 应用程序来说是不是太大了? (2认同)
  • 抱歉,我认为这个问题与Android有关,但现在我意识到这只是纯Java语言 (2认同)

dom*_*som 17

这对我有用:

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

  • 此方法不保证读取整个文件. (5认同)
  • 你是对的,要确保read()的返回值必须与file.length()匹配,然后如果文件不完整则继续读取... (2认同)

Viv*_*sse 13

用一个ByteArrayOutputStream.这是过程:

  • 获取InputStream读取数据
  • 创建一个ByteArrayOutputStream.
  • 将所有内容复制InputStreamOutputStream
  • 让您byte[]ByteArrayOutputStream使用toByteArray()方法


BaS*_*che 7

看看下面的apache commons函数:

org.apache.commons.io.FileUtils.readFileToByteArray(File)
Run Code Online (Sandbox Code Playgroud)