title: ObjectInputStream readObject EOFException
body: <p>I have tried to use <a href="https://stackoverflow.com/questions/10770263/decodebytearray-and-copypixelstobuffer-not-working-skimagedecoderfactory-retu">this question's answer</a> to get a functioning implementation, but I get various errors and am now down to an EOFException and on debugging, it appears the file does not get written.</p>
  
  <p>The goal is to download an image from a URL, save it to internal cache, then later fetch it from that cache for displaying.  Where have I gone wrong?  The EOFException is thrown in CachedImage.java on the line which reads <code>byte[] data = (byte[]) ois.readObject();</code></p>
  
  <p>CachedImage.java</p>
  
  <pre><code>package com.example.droid;
  
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.Serializable;
  import java.nio.BufferUnderflowException;
  import java.nio.ByteBuffer;
  
  import android.graphics.Bitmap;
  
  public class CachedImage implements Serializable {
    private static final long serialVersionUID = -12345678987654321L;
    private transient Bitmap _bmp;
  
    public CachedImage(Bitmap bmp) {
      this._bmp = bmp;
    }
  
    public void writeObject(ObjectOutputStream oos) throws IOException {
      oos.defaultWriteObject();
  
      if (this._bmp != null) {
        int bytes = this._bmp.getWidth() * this._bmp.getHeight() * 4;
  
        ByteBuffer buffer = ByteBuffer.allocate(bytes);
        this._bmp.copyPixelsToBuffer(buffer);
  
        if (buffer.hasArray()) {
          try {
            String configName = this._bmp.getConfig().name();
  
            byte[] array = buffer.array();
  
            oos.writeObject(array);
            oos.writeInt(this._bmp.getWidth());
            oos.writeInt(this._bmp.getHeight());
            oos.writeObject(configName);
          } catch (BufferUnderflowException e) {
          }
        }
      } else {
        oos.writeObject(null);
      }
    }
  
    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
      ois.defaultReadObject();
  
      byte[] data = (byte[]) ois.readObject();
      if (data != null) {
        int w = ois.readInt();
        int h = ois.readInt();
        String configName = (String) ois.readObject();
  
        Bitmap.Config configBmp = Bitmap.Config.valueOf(configName);
        Bitmap bitmap_tmp = Bitmap.createBitmap(w, h, configBmp);
        ByteBuffer buffer = ByteBuffer.wrap(data);
  
        bitmap_tmp.copyPixelsFromBuffer(buffer);
  
        this._bmp = bitmap_tmp.copy(configBmp, true);
  
        bitmap_tmp.recycle();
      } else {
        this._bmp = null;
      }
    }
    public Bitmap getBitmap() {
      return this._bmp;
    }
  }
  </code></pre>
  
  <p>And here are the code segments which trigger the calls:</p>
  
  <p>Async callback function for when the image is fetched from the URL to write the image to internal:</p>
  
  <pre><code>@Override
  protected void onPostExecute(Bitmap result) {
    if (result != null) {
        FileOutputStream output = null;
        ObjectOutputStream oos = null;
        try {
          output = ICEApplication.getAppContext().openFileOutput(filename, Context.MODE_PRIVATE);
          oos = new ObjectOutputStream(output);
          CachedImage cachedImage = new CachedImage(result);
          oos.writeObject(cachedImage);
        } catch (Exception e) {
          Log.d("DEBUG", "Exception: " + e.getMessage());
        } finally {
          if (output != null) {
            try {
              oos.close();
              output.close();
            } catch (IOException e) {
            }
          }
        }
      }
    }
  </code></pre>
  
  <p>The code to read the image from disk after downloaded and saved:</p>
  
  <pre><code>Bitmap image = null;
  FileInputStream input = null;
  ObjectInputStream ois = null;
  try {
    input = ICEApplication.getAppContext().openFileInput(urldisplay);
    ois = new ObjectInputStream(input);
    CachedImage cachedImage = (CachedImage)ois.readObject();
  
    image = cachedImage.getBitmap();
  } catch (Exception e) {
    Log.d("DEBUG", "Exception: " + e.getMessage());
    return null;
  } finally {
    if (input != null) {
      try {
        ois.close();
        input.close();
      } catch (IOException e) {
  
      }
    }
  }
  </code></pre>