在 Java 中将二进制输入流读取到单字节数组中

2022-08-31 21:07:18

文档说,不应该使用方法来确定.如何将整个内容读入字节数组?available()InputStreamInputStream

InputStream in; //assuming already present
byte[] data = new byte[in.available()];
in.read(data);//now data is filled with the whole content of the InputStream

我可以多次读取到固定大小的缓冲区中,但是,我必须将读取的数据合并到一个单字节数组中,这对我来说是一个问题。


答案 1

IMO最简单的方法是使用番石榴及其ByteStreams类:

byte[] bytes = ByteStreams.toByteArray(in);

或者对于文件:

byte[] bytes = Files.toByteArray(file);

或者(如果你不想使用番石榴),你可以创建一个ByteArrayOutputStream,并重复读取到一个字节数组并写入(让该句柄调整大小),然后调用ByteArrayOutputStream.toByteArray()ByteArrayOutputStream

请注意,无论您是否能分辨输入的长度,此方法都有效 - 当然,假设您有足够的内存。


答案 2

请记住,此处的答案假定文件的长度小于或等于 (2147483647)。Integer.MAX_VALUE

如果要从文件中读取,则可以执行如下操作:

    File file = new File("myFile");
    byte[] fileData = new byte[(int) file.length()];
    DataInputStream dis = new DataInputStream(new FileInputStream(file));
    dis.readFully(fileData);
    dis.close();

更新(2014 年 5 月 31 日):

Java 7 在 java.nio.file 包中添加了一些新功能,可用于使此示例缩短几行。请参阅 java.nio.file.Files 类中的 readAllBytes() 方法。下面是一个简短示例:

import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;

// ...
        Path p = FileSystems.getDefault().getPath("", "myFile");
        byte [] fileData = Files.readAllBytes(p);

Android 从 Api 级别 26(8.0.0,Oreo)开始就支持此功能。


推荐