Проблемы с вводом / выводом с Android (в основном ObjectInputStream) - PullRequest
3 голосов
/ 03 марта 2012

Первый раз здесь, так что будьте осторожны со мной!

Попытка создать метод, который читает файл omw.data, проверяет, существует ли объект SavedSession в файле. Если это так, игнорируйте его, в противном случае добавьте его в конец файла.

Я могу добавить один объект, при добавлении того же SavedSession он работает правильно, говоря, что он уже добавлен. При добавлении другого типа SavedSession он говорит, что он добавлен, но при попытке прочитать omw.data он выдает

java.io.StreamCorruptedException: неправильный формат: ac

SavedSession не содержит объект GeoPoint, вместо этого он просто использует его для получения широты и долготы.

Любая помощь будет благодарна. Я пытался искать и пробовал несколько разных методов, или не совсем понял, в чем проблема.

Спасибо, если я что-то упустил, дайте мне знать, и я все исправлю.

public void saveDestination(GeoPoint to, String message,
        List<String> contactNumbers) throws IOException {
    SavedSession newSession = new SavedSession(to, message, contactNumbers);

    FileOutputStream fos = c.openFileOutput("omw.data", Context.MODE_APPEND);
    fos.close();

    FileInputStream fis = c.openFileInput("omw.data");      

    try {
        ObjectInputStream ois = new ObjectInputStream(fis);
        List<SavedSession> previousSessions = new LinkedList<SavedSession>();           

        try {
            Object prevSession = null;
            while ((prevSession = ois.readObject()) != null) {
                previousSessions.add((SavedSession) prevSession);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch(EOFException ex){
            System.out.println("End of file reached found: " + previousSessions.size());
        }
        finally {
            System.out.println("ois closed");
            ois.close();
        }

        if (previousSessions.contains(newSession)) {
            Toast.makeText(c, "Already contained!", Toast.LENGTH_LONG)
                    .show();
            return;
        }

    } catch (EOFException ex) {
        ex.printStackTrace();
    }

    fos = c.openFileOutput("omw.data", Context.MODE_APPEND);        

    ObjectOutputStream oos = new ObjectOutputStream(fos);

    oos.writeObject(newSession);
    oos.flush();
    oos.close();        


    Toast.makeText(c, "Added Item", Toast.LENGTH_LONG).show();

}

Ошибка

03-03 01:56:27.452: W/System.err(3631): java.io.StreamCorruptedException: Wrong format: ac
03-03 01:56:27.452: W/System.err(3631):     at java.io.ObjectInputStream.corruptStream(ObjectInputStream.java:830)
03-03 01:56:27.452: W/System.err(3631):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:943)
03-03 01:56:27.462: W/System.err(3631):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)
03-03 01:56:27.462: W/System.err(3631):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217)
03-03 01:56:27.462: W/System.err(3631):     at com.mat.omw.fileoperations.FileSaver.saveDestination(FileSaver.java:41)
03-03 01:56:27.462: W/System.err(3631):     at com.mat.omw.maps.MapDestination.onOptionsItemSelected(MapDestination.java:284)
03-03 01:56:27.462: W/System.err(3631):     at android.app.Activity.onMenuItemSelected(Activity.java:2337)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:795)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:160)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:885)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:545)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
03-03 01:56:27.462: W/System.err(3631):     at android.view.View$PerformClick.run(View.java:9293)
03-03 01:56:27.462: W/System.err(3631):     at android.os.Handler.handleCallback(Handler.java:587)
03-03 01:56:27.462: W/System.err(3631):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-03 01:56:27.462: W/System.err(3631):     at android.os.Looper.loop(Looper.java:150)
03-03 01:56:27.462: W/System.err(3631):     at android.app.ActivityThread.main(ActivityThread.java:4277)
03-03 01:56:27.462: W/System.err(3631):     at java.lang.reflect.Method.invokeNative(Native Method)
03-03 01:56:27.462: W/System.err(3631):     at java.lang.reflect.Method.invoke(Method.java:507)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-03 01:56:27.462: W/System.err(3631):     at dalvik.system.NativeStart.main(Native Method)

Редактировать: Читать это

Обнаружил, что вы не можете добавить по какой-то причине, не слишком уверен, почему. Изменен код для перезаписи данных каждый раз, но он кажется крайне неэффективным.

...