2

Anytime I try to serialize a file I get the error: FileNotFound. Not sure why. Here is my FileHelper code:

package org.stocktwits.helper;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import org.stocktwits.model.Quote;

public class FileHelper {
    // Returns the contents of the file in a byte array.
    public static byte[] getBytesFromFile(File file) throws IOException {
        InputStream is = new FileInputStream(file);

        // Get the size of the file
        long length = file.length();

        // You cannot create an array using a long type.
        // It needs to be an int type.
        // Before converting to an int type, check
        // to ensure that file is not larger than Integer.MAX_VALUE.
        if (length > Integer.MAX_VALUE) {
            // File is too large
        }

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int)length];

        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
               && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }

        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }

        // Close the input stream and return bytes
        is.close();
        return bytes;
    }

    public static void serializeQuotes(ArrayList<Quote> quotes){
        try {
            // Serialize to a file
            ObjectOutput out = new ObjectOutputStream(new FileOutputStream("quotes.ser"));
            out.writeObject(quotes);
            out.close();

            // Serialize to a byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
            out = new ObjectOutputStream(bos) ;
            out.writeObject(quotes);
            out.close();

            // Get the bytes of the serialized object
            //byte[] buf = bos.toByteArray();
        } catch (IOException e) {
            System.out.println(e);
        }
    }

    @SuppressWarnings("unchecked")
    public static void deserializeQuotes(ArrayList<Quote> quotes){
        try {
            // Deserialize from a file
            File file = new File("quotes.ser");
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
            // Deserialize the object
            quotes = (ArrayList<Quote>) in.readObject();
            in.close();

            // Get some byte array data
            byte[] bytes = FileHelper.getBytesFromFile(file);
            // see Reading a File into a Byte Array for the implementation of this method

            // Deserialize from a byte array
            in = new ObjectInputStream(new ByteArrayInputStream(bytes));
            quotes = (ArrayList<Quote>) in.readObject();
            in.close();
        } catch (ClassNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }
    }   
}
6
  • Ah, I remember doing something like this before. In the end we just gave up and implemented our own (de)serialization methods. Commented Aug 28, 2010 at 0:46
  • Can you include the stack trace? Commented Aug 28, 2010 at 0:48
  • 1
    Please replace System.out.println(e); by e.printStackTrace() or just throw e. Commented Aug 28, 2010 at 1:12
  • @NullUser: you wrote your own serialization because you couldn't open a file? Commented Aug 28, 2010 at 8:17
  • @EJP No, because the object couldn't be deserialized correctly. Commented Aug 28, 2010 at 8:30

1 Answer 1

8
private void serializeQuotes(){
        FileOutputStream fos;
        try {
            fos = openFileOutput(Constants.FILENAME, Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(quotes); 
            oos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
    private void deserializeQuotes(){
        try{
            FileInputStream fis = openFileInput(Constants.FILENAME);
            ObjectInputStream ois = new ObjectInputStream(fis);
            quotes = (ArrayList<Quote>) ois.readObject();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
Sign up to request clarification or add additional context in comments.

2 Comments

Actually you solved it by fixing the cause of the FileNotFoundException, which didn't have anything to do with this code, huge improvement though it is.
Yeah, Context.MODE_PRIVATE solves the FileNotFoundException for Android

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.