The documentation says that one should not use
available() method to determine the size of an
InputStream. How can I read the whole content of an
InputStream into a byte array?
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
I could read multiple times into a buffer of a fixed size, but then, I will have to combine the data I read into a single byte array, which is a problem for me.
This question is tagged with
~ Asked on 2011-08-30 21:50:25
byte bytes = ByteStreams.toByteArray(in);
Or for a file:
byte bytes = Files.toByteArray(file);
Alternatively (if you didn't want to use Guava), you could create a
ByteArrayOutputStream, and repeatedly read into a byte array and write into the
ByteArrayOutputStream (letting that handle resizing), then call
Note that this approach works whether you can tell the length of your input or not - assuming you have enough memory, of course.
~ Answered on 2011-08-30 21:53:54
Please keep in mind that the answers here assume that the length of the file is less than or equal to
If you are reading in from a file, you can do something like this:
File file = new File("myFile"); byte fileData = new byte[(int) file.length()]; DataInputStream dis = new DataInputStream(new FileInputStream(file)); dis.readFully(fileData); dis.close();
Java 7 adds some new features in the java.nio.file package that can be used to make this example a few lines shorter. See the readAllBytes() method in the java.nio.file.Files class. Here is a short example:
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 has support for this starting in Api level 26 (8.0.0, Oreo).
~ Answered on 2011-08-30 21:55:20