Hello,
I have a very strange problem here. I have found the solution, but I would
like to know what is happening.
I load a file from a JAR file, using the following code :
InputStream stream=this.getClass().getResourceAsStream(name);
if (stream!=null)
{
int size=stream.available();
byte data[]=new byte[size];
stream.read(data);
}
stream.available() returns the correct size, the size of the file in the jar
file (0x1610E).
But the above code does not work! Only the first 0x3111 bytes of the stream
are read, the rest of the array is still 0!
But it works if I do the following code !
int c;
for (c=0; c<size; c++)
{
data[c]=(byte)stream.read();
}
Could it be that the stream cannot handle such a massive data output at
once?
Have you got any idea about this?
Thanks!
Owen Jacobson - 23 Oct 2007 18:10 GMT
> Hello,
>
[quoted text clipped - 28 lines]
>
> Thanks!
InputStreams are never, ever guaranteed to read the entire size of the
buffer, regardless of where you're reading from. You *must* use the
return value to find out how many bytes were actually read and whether
or not you've reached the end of the stream yet.
This is very clearly laid out in the javadoc for InputStream:
<http://java.sun.com/javase/6/docs/api/java/io/
InputStream.html#read(byte[])>
You should embed the read in a loop that reads the next chunk until
you reach end of stream. You might find this variant of read easier
to work with for this:
<http://java.sun.com/javase/6/docs/api/java/io/
InputStream.html#read(byte[],%20int,%20int)>
Real Gagnon - 23 Oct 2007 18:17 GMT
> InputStream stream=this.getClass().getResourceAsStream(name);
> if (stream!=null)
[quoted text clipped - 3 lines]
> stream.read(data);
> }
stream.read(data) returns the actual number of bytes read. You have to
loop until the read(data) operation returns -1 (no more data).
Try with something like :
int bytesRead = stream.read(data,0,data.length);
int current = bytesRead;
do {
bytesRead =
stream.read(data, current, (data.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
Bye.

Signature
Real Gagnon from Quebec, Canada
* Java, Javascript, VBScript and PowerBuilder code snippets
* http://www.rgagnon.com/howto.html
* http://www.rgagnon.com/bigindex.html
Roedy Green - 23 Oct 2007 20:41 GMT
> int size=stream.available();
That's not how you read a stream. available does not mean how many
bytes are in the file.
see http://mindprod.com/applet/fileio.html

Signature
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com