Taking the Contents of a File object and converting it to a byte array

M

MattC

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?

Thanks!

****************


/* Move the data in the File object to a byte array */
InputStream in = new FileInputStream(templateFile);
int length = new Long(templateFile.length()).intValue();
ByteArrayOutputStream out = new ByteArrayOutputStream(length);

byte[] buf = new byte[1024];
int len;

while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}

byte[] certBytes = new byte[out.size()];
certBytes = out.toByteArray();
 
T

Thomas Hawtin

MattC said:
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
 
R

Roedy Green

/* Move the data in the File object to a byte array */
InputStream in = new FileInputStream(templateFile);
int length = new Long(templateFile.length()).intValue();
ByteArrayOutputStream out = new ByteArrayOutputStream(length);

byte[] buf = new byte[1024];
int len;

while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}

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.
 
T

Thomas Hawtin

(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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top