> I have a file that I need to read into my program and convert to a byte
> array (byte [] ). The code below works but it seems sort of "smelly".
> Can someone suggest a cleaner, more eloquent, way of accomplishing
> this?
What smells about it to you?
> /* Move the data in the File object to a byte array */
You should ensure that you always close the stream.
> InputStream in = new FileInputStream(templateFile);
try {
> int length = new Long(templateFile.length()).intValue();
> ByteArrayOutputStream out = new ByteArrayOutputStream(length);
>
> byte[] buf = new byte[1024];
A bit small in this day an age, I think. I go for 8192 out of habit.
Unlikely to make much difference.
> int len;
>
> while ((len = in.read(buf)) > 0) {
I prefer to avoid side effects in conditional expressions, and also
testing explicitly against -1. A value of 0 probably should not break
the loop.
> out.write(buf, 0, len);
> }
} finally {
in.close();
}
The allocation is entirely pointless as the next line overwrites the array.
> byte[] certBytes = new byte[out.size()];
> certBytes = out.toByteArray();
You could read the length of the file first and allocate an exact sized
buffer, but the code above is safer and less tied to specifics.
Tom Hawtin

Signature
Unemployed English Java programmer
http://jroller.com/page/tackline/
> int length = new Long(templateFile.length()).intValue();
this is a bit roundabout. Try
int length = (int) templateFile.length();

Signature
Canadian Mind Products, Roedy Green.
http://mindprod.com Java custom programming, consulting and coaching.
> /* Move the data in the File object to a byte array */
> InputStream in = new FileInputStream(templateFile);
[quoted text clipped - 10 lines]
> byte[] certBytes = new byte[out.size()];
> certBytes = out.toByteArray();
You can read the entire file of raw bytes in one i/o into your
certBytes. See http://mindprod.com/applets/fileio.html
You don't need a ByteArrayOutputStream or a byte[1024] buffer.
Even if you did need a buffer, use a BufferedInputStream rather than
rolling your own.

Signature
Canadian Mind Products, Roedy Green.
http://mindprod.com Java custom programming, consulting and coaching.
Thomas Hawtin - 30 Dec 2005 20:12 GMT
>> /* Move the data in the File object to a byte array */
>> InputStream in = new FileInputStream(templateFile);
>> int length = new Long(templateFile.length()).intValue();
(I didn't see that...)
> You don't need a ByteArrayOutputStream or a byte[1024] buffer.
>
> Even if you did need a buffer, use a BufferedInputStream rather than
> rolling your own.
You don't mean reading a byte at a time, do you? If nothing else, the
synchronisation would kill performance, unless the JVM was something
special.
Tom Hawtin

Signature
Unemployed English Java programmer
http://jroller.com/page/tackline/