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


当前回答

可以像这样简单地完成(Kotlin版本)

val byteArray = File(path).inputStream().readBytes()

编辑:

我读过readBytes方法的文档。它说:

将此流完全读入字节数组。 注意:关闭这个流是调用者的责任。

因此,为了能够关闭流,同时保持一切干净,使用以下代码:

val byteArray = File(path).inputStream().use { it.readBytes() }

感谢@user2768856指出这一点。

其他回答

如果你没有Java 8,并且同意我的观点,加入一个庞大的库来避免写几行代码是一个坏主意:

public static byte[] readBytes(InputStream inputStream) throws IOException {
    byte[] b = new byte[1024];
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    int c;
    while ((c = inputStream.read(b)) != -1) {
        os.write(b, 0, c);
    }
    return os.toByteArray();
}

调用者负责关闭流。

Guava有Files.toByteArray()可以提供给您。它有几个优点:

它涵盖了文件报告长度为0但仍然有内容的极端情况 它是高度优化的,如果在加载文件之前试图读入一个大文件,你会得到一个OutOfMemoryException。(通过巧妙地使用file.length()) 你没必要白费力气。

这是最简单的方法之一

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

在JDK8

Stream<String> lines = Files.lines(path);
String data = lines.collect(Collectors.joining("\n"));
lines.close();

从文件中读取字节的另一种方法

Reader reader = null;
    try {
        reader = new FileReader(file);
        char buf[] = new char[8192];
        int len;
        StringBuilder s = new StringBuilder();
        while ((len = reader.read(buf)) >= 0) {
            s.append(buf, 0, len);
            byte[] byteArray = s.toString().getBytes();
        }
    } catch(FileNotFoundException ex) {
    } catch(IOException e) {
    }
    finally {
        if (reader != null) {
            reader.close();
        }
    }