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

Discussion in 'Java' started by MattC, Dec 30, 2005.

  1. MattC

    MattC Guest

    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();
     
    MattC, Dec 30, 2005
    #1
    1. Advertisements

  2. What smells about it to you?
    You should ensure that you always close the stream.
    A bit small in this day an age, I think. I go for 8192 out of habit.
    Unlikely to make much difference.
    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.
    } finally {
    in.close();
    }
    The allocation is entirely pointless as the next line overwrites the array.
    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
     
    Thomas Hawtin, Dec 30, 2005
    #2
    1. Advertisements

  3. MattC

    Roedy Green Guest

    this is a bit roundabout. Try
    int length = (int) templateFile.length();
     
    Roedy Green, Dec 30, 2005
    #3
  4. MattC

    Roedy Green Guest

    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.
     
    Roedy Green, Dec 30, 2005
    #4
  5. (I didn't see that...)
    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
     
    Thomas Hawtin, Dec 30, 2005
    #5
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.