35

I am reading dds textures, but since once built the jar I can't access those textures through url and file and have to use InputStream instead.

So I would need to know how I can obtain a java.​nio.ByteBuffer from an java.io.InputStream.

Ps: no matter through 3rd part libraries, I just need it working

Blip
  • 3,061
  • 5
  • 22
  • 50
elect
  • 6,765
  • 10
  • 53
  • 119

3 Answers3

53

For me the best in this case is Apache commons-io to handle this and similar tasks.

The IOUtils type has a static method to read an InputStream and return a byte[].

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

Internally this creates a ByteArrayOutputStream and copies the bytes to the output, then calls toByteArray().

UPDATE: as long as you have the byte array, as @Peter pointed, you have to convert to ByteBuffer

ByteBuffer.wrap(bytes)

JAVA 9 UPDATE: as stated by @saka1029 if you're using java 9+ you can use the default InputStream API which now includes InputStream::readAllBytes function, so no external libraries needed

InputStream is;
byte[] bytes = is.readAllBytes()
Jordi Castilla
  • 26,609
  • 8
  • 70
  • 109
3

What is about:

ReadableByteChannel channel = Channels.newChannel(inputStream);
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);

while (channel.read(buffer) != -1) {
  //write buffer

};
swepss
  • 481
  • 3
  • 9
  • Are you sure that `read()` returns -1 when input stream ends? Sometimes it returns 0. – happy_marmoset Apr 18 '21 at 11:57
  • Yes, I am %)) this is from javadoc from ReadableByteChannel ```Returns: The number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream``` – swepss May 12 '21 at 11:38
  • If the buffer isn't big enough to read the entire input stream this can get stuck in a busy loop trying to read 0 bytes over and over. Depending on how the body of the loop deals with the buffer. e.g. if you just want to read everything into a buffer and return the buffer, so the buffer won't be emptied or flipped in the loop. – swpalmer Aug 19 '21 at 21:11
2

A neat solution with no 3rd party library needed is

ByteBuffer byteBuffer = ByteBuffer.allocate(inputStream.available());
Channels.newChannel(inputStream).read(byteBuffer);

See ReadableByteChannel#read(ByteBuffer)

James Mudd
  • 1,816
  • 1
  • 20
  • 25