我如何将java.io.File转换为字节[]?


当前回答

我相信这是最简单的方法:

org.apache.commons.io.FileUtils.readFileToByteArray(file);

其他回答

你也可以使用NIO api来实现。只要总文件大小(以字节为单位)适合int类型,我就可以用这段代码做到这一点。

File f = new File("c:\\wscp.script");
FileInputStream fin = null;
FileChannel ch = null;
try {
    fin = new FileInputStream(f);
    ch = fin.getChannel();
    int size = (int) ch.size();
    MappedByteBuffer buf = ch.map(MapMode.READ_ONLY, 0, size);
    byte[] bytes = new byte[size];
    buf.get(bytes);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    try {
        if (fin != null) {
            fin.close();
        }
        if (ch != null) {
            ch.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我认为它非常快,因为它使用MappedByteBuffer。

如果您想将字节读入预分配的字节缓冲区,这个答案可能会有所帮助。

您的第一个猜测可能是使用InputStream read(byte[])。然而,这种方法有一个缺陷,使得它难以使用:即使没有遇到EOF,也不能保证数组实际上会被完全填充。

相反,看一下DataInputStream readFully(byte[])。这是一个输入流的包装器,没有上面提到的问题。此外,该方法在遇到EOF时抛出。好得多。

试试这个:

import sun.misc.IOUtils;
import java.io.IOException;

try {
    String path="";
    InputStream inputStream=new FileInputStream(path);
    byte[] data=IOUtils.readFully(inputStream,-1,false);
}
catch (IOException e) {
    System.out.println(e);
}

简单的方法:

File fff = new File("/path/to/file");
FileInputStream fileInputStream = new FileInputStream(fff);

// int byteLength = fff.length(); 

// In android the result of file.length() is long
long byteLength = fff.length(); // byte count of the file-content

byte[] filecontent = new byte[(int) byteLength];
fileInputStream.read(filecontent, 0, (int) byteLength);

JDK 7以来的一行代码:

byte[] array = Files.readAllBytes(Paths.get("/path/to/file"));

不需要外部依赖。