【问题标题】:ObjectInputStream.readObject does not retrieve objectObjectInputStream.readObject 不检索对象
【发布时间】:2015-10-04 18:35:30
【问题描述】:

如果 ObjectInputStream.objectRead 似乎对我不起作用的原因是因为我错过了一些明显的东西,我不会感到惊讶。

您将在下面找到代码和应用程​​序日志输出。

不抛出异常。代码执行完毕。

但是,从 SDCard 检索到的文件是空的(由 .size() 为 0 证明)虽然当我在 SDCard 上检查它时它的大小大于 0(几个 KBytes)并且我能够写入文件(追加模式)没有问题(证明 .writeObject 操作后文件大小增加。

我被困住了。我可能错过了一些明显的东西,但我找不到问题。

非常感谢您提供反馈、建议或问题的解决方案。

谢谢,

亚历克斯·唐尼尼

100315-2 上的源代码更新

 protected static synchronized void readUserLocationInformation() throws StreamCorruptedException, IOException, ClassNotFoundException
 {

 ArrayList<userLocationInformation> mUserLocationInformation = new ArrayList<userLocationInformation>();

 int mUserLocationInformationSize = mUserLocationInformation.size();

 createUserLocationDatabaseOnSdCardStorage();

    userLocationInformation userLocationInformationHolder = new userLocationInformation();
    userLocationInformationHolder.lat = myAndApsLatlng[0];
    userLocationInformationHolder.lon = myAndApsLatlng[1];
    System.arraycopy( myAndApsLatlng, 0, userLocationInformationHolder.myAndApsLatlng, 0, myAndApsLatlng.length);
    userLocationInformationHolder.estimateTime = System.nanoTime();

    mUserLocationInformation.add(userLocationInformationHolder);

    mUserLocationInformationSize = mUserLocationInformation.size();

    try {
        Log.i(TAG, " - readUserLocationInformation - mUserLocationInformationSize - " + mUserLocationInformationSize);

        if(mUserLocationInformationSize > 0)
        {
            for(int f = 0; f < mUserLocationInformationSize; ++f)
            {
                Log.i(TAG, " - readUserLocationInformation - mUserLocationInformation.get(f).estimateTime - " + mUserLocationInformation.get(f).estimateTime);
                Log.i(TAG, " - readUserLocationInformation - mUserLocationInformation.get(f).lat - " + mUserLocationInformation.get(f).lat);
                Log.i(TAG, " - readUserLocationInformation - mUserLocationInformation.get(f).lon - " + mUserLocationInformation.get(f).lon);
            }
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }               


    //write object to external storage START $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    Object objectToBeStoredHolder;

    FileOutputStream objectNameFileOutputStream = null;
    OutputStream objectNameBufferedOutputStream = null;
    ObjectOutputStream objectNameObjectOutputStream = null;

    objectToBeStoredHolder = mUserLocationInformation;

        try
        {
            try
            {

                   Log.i(TAG, " - readUserLocationInformation - object - "+userLocationDatabaseFileNameObject);

            Log.i(TAG, " - readUserLocationInformation - setting up objectNameFileOutputStream --- ");

            objectNameFileOutputStream = new FileOutputStream(objectStorageLocationDirectory+userLocationDatabaseFileNameObject, true);

        } catch (IOException e1)
        {
            e1.printStackTrace();
        }

            try 
                {

                   Log.i(TAG, " - readUserLocationInformation - object - "+userLocationDatabaseFileNameObject);

                    Log.i(TAG, " - readUserLocationInformation - setting up objectNameBufferedOutputStream --- ");

                objectNameBufferedOutputStream = new BufferedOutputStream(objectNameFileOutputStream);
            } 
                catch (Exception e1) 
                {
                e1.printStackTrace();
            }

        try
        {

               Log.i(TAG, " - readUserLocationInformation - object - "+userLocationDatabaseFileNameObject);

            Log.i(TAG, " - readUserLocationInformation - setting up objectNameObjectOutputStream --- ");

            objectNameObjectOutputStream = new ObjectOutputStream(objectNameBufferedOutputStream);

        }
        catch (Exception e)
        {

               Log.i(TAG, " - readUserLocationInformation - exception - object - "+userLocationDatabaseFileNameObject);

            e.printStackTrace();
        }


        try 
        {

               Log.i(TAG, " - readUserLocationInformation - objectNameObjectOutputStream.writeObject - object - "+userLocationDatabaseFileNameObject);

            objectNameObjectOutputStream.writeObject(objectToBeStoredHolder);

        }

      finally
      {

           Log.i(TAG, " - readUserLocationInformation - finally objectNameObjectOutputStream for object - "+userLocationDatabaseFileNameObject);

            objectNameObjectOutputStream.flush();
            objectNameObjectOutputStream.close();
      }

        }
        catch (Exception e) 
        {

               Log.i(TAG, " - readUserLocationInformation - object - "+userLocationDatabaseFileNameObject);

            Log.i(TAG,
                    " - readUserLocationInformation - FAILED to write object ObjectToBeStored --- ");
            e.printStackTrace();

        }

        //write object to external storage END $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    Log.i(TAG, " - readUserLocationInformation - retrieving user location database stored on SDcard as arraylist --- ");

    FileInputStream userLocationObjectFileInputStream = null;

    ObjectInputStream userLocationInputStream = null;

    Log.i(TAG, " - readUserLocationInformation - setting up FileInputStream --- ");

    userLocationObjectFileInputStream = new FileInputStream(objectStorageLocationDirectory+userLocationDatabaseFileNameObject);

    Log.i(TAG, " - readUserLocationInformation - setting up ObjectInputStream --- ");

    userLocationInputStream = new ObjectInputStream(userLocationObjectFileInputStream);

    Log.i(TAG, " - readUserLocationInformation - retrieving user location list stored in ArrayList from SDcard --- ");

    mUserLocationInformation = (ArrayList) userLocationInputStream.readObject();            

    mUserLocationInformationSize = mUserLocationInformation.size();

    Log.i(TAG, "readUserLocationInformation - mUserLocationInformationSize - "+mUserLocationInformationSize);

    if(mUserLocationInformationSize > 0)
        {
            for(int f = 0; f < mUserLocationInformationSize; ++f)
                {
                    Log.i(TAG, " - readUserLocationInformation - mUserLocationInformation.get(f).estimateTime - " + mUserLocationInformation.get(f).estimateTime);
                    Log.i(TAG, " - readUserLocationInformation - mUserLocationInformation.get(f).lat - " + mUserLocationInformation.get(f).lat);
                    Log.i(TAG, " - readUserLocationInformation - mUserLocationInformation.get(f).lon - " + mUserLocationInformation.get(f).lon);
                }
        }

 }

应用程序日志 - 更新于 100315-2

10-05 18:11:51.548: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - mUserLocationInformationSize - 1
10-05 18:11:51.548: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - mUserLocationInformation.get(f).estimateTime - 6768145557155
10-05 18:11:51.548: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - mUserLocationInformation.get(f).lat - 42.35552279549794
10-05 18:11:51.548: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - mUserLocationInformation.get(f).lon - -71.17862967362912
10-05 18:11:51.548: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - object - userLocationDatabaseFileNameObject
10-05 18:11:51.548: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - setting up objectNameFileOutputStream --- 
10-05 18:11:51.549: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - object - userLocationDatabaseFileNameObject
10-05 18:11:51.549: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - setting up objectNameBufferedOutputStream --- 
10-05 18:11:51.549: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - object - userLocationDatabaseFileNameObject
10-05 18:11:51.549: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - setting up objectNameObjectOutputStream --- 
10-05 18:11:51.549: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - objectNameObjectOutputStream.writeObject - object - userLocationDatabaseFileNameObject
10-05 18:11:51.551: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - finally objectNameObjectOutputStream for object - userLocationDatabaseFileNameObject
10-05 18:11:51.552: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - retrieving user location database stored on SDcard as arraylist --- 
10-05 18:11:51.552: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - setting up FileInputStream --- 
10-05 18:11:51.552: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - setting up ObjectInputStream --- 
10-05 18:11:51.552: I/ContinuousLocationTrackingService(10206):  - readUserLocationInformation - retrieving user location list stored in ArrayList from SDcard --- 
10-05 18:11:51.553: I/ContinuousLocationTrackingService(10206): readUserLocationInformation - mUserLocationInformationSize - 0

createUserLocationDatabaseOnSdCardStorage() 的源代码

protected static void createUserLocationDatabaseOnSdCardStorage()
{
boolean userLocationdatabaseCreateActionResult = false;

if(!userLocationDatabaseObject.exists())
{
        try {
            userLocationdatabaseCreateActionResult = userLocationDatabaseObject.createNewFile();
        } catch (IOException e) {
            Log.i(TAG, "createUserLocationDatabaseOnSdCardStorage - FAILED to create userLocationDatabaseObject --- ");
            e.printStackTrace();
        }
     if (userLocationdatabaseCreateActionResult) {
            Log.i(TAG, "createUserLocationDatabaseOnSdCardStorage - userLocationDatabaseObject created successfully --- ");
     } else {
            Log.i(TAG, "createUserLocationDatabaseOnSdCardStorage - userLocationDatabaseObject not created --- ");
     }
}
 else
 {
     Log.i(TAG, "createUserLocationDatabaseOnSdCardStorage - userLocationDatabaseObject already exists --- ");
 }

}

userLocationInformation 类的定义

    public static class userLocationInformation implements Serializable, Comparator<userLocationInformation>
    {
        public long estimateTime = 0l;
        public double lat;
        public double lon;
        public double[] myAndApsLatlng = new double[10];
        public double alternateLatitude = 0.0;
        public double alternateLongitude = 0.0;
        public double locationAltitude = 0.0;
        public long locationTime = 0;
        public float locationSpeed = 0.0f;
        public float locationAccuracy = 0.0f;
        public float locationBearing = 0.0f;

        @Override
        public int compare(userLocationInformation one, userLocationInformation another) {

            long estimateTimeOne = one.estimateTime;
            long estimateTimeAnother = another.estimateTime;

            return (one.estimateTime < another.estimateTime ? -1 :
                   (estimateTimeOne == estimateTimeAnother ? 0 : 1));

        }

    }

【问题讨论】:

  • 不要这样写代码。依赖于前一个 try 块中代码成功的代码应该在同一个 try 块内。
  • 谢谢。我去做。关于为什么 objectRead 不检索文件(并且没有抛出异常)的任何想法?谢谢
  • 显然,我的意思是 readObject。对不起
  • 当您的代码处于不可读和无效状态时,请不要这样做。修复它,重新测试,并在必要时编辑您的帖子。
  • 去掉所有try/catch块后,结果还是一样,mUserLocationInformation还是空。

标签: java android arraylist objectinputstream


【解决方案1】:

writeObject() 通话后

什么writeObject()打电话?

您发布的代码中没有writeObject() 调用。

如果这是所有相关代码,那么您所做的就是创建一个空文件。您不能合理地期望从中反序列化对象。

您需要摆脱仅调用createNewFile() 的逻辑,并替换为:

  • 致电new FileOutputStream()
  • 致电new ObjectOutputStream()
  • 调用writeObject() 并使用您希望稍后从文件中读回的数据
  • 关闭ObjectOutputStream

NB 看看代码通过一次 try/catch 看起来有多好?

【讨论】:

  • 文件是用另一种方法写入的。有用。正如我在原始帖子中提到的,当我检查设备上的 SDCard 时,文件存在并按预期增长,在每次执行 readUserLocationInformation() 是一个方法的主应用程序之后。我检查了文件名,它们匹配。
  • 我将用于写入外部存储的方法中的代码添加到 readUserLocationInformation()。它没有任何区别。 try/catch 子句没有任何区别,用于写入外部存储的方法按预期工作就证明了这一点。
  • (a) 文件由另一种方法写入,导致该方法不起作用。你不能把它描述为工作。 (b) 我没有说过这个问题是由糟糕的 try-catch 结构引起的。我只是说它很差,在修复之前无法理解您的代码。您将不得不发布写作方法,原样,而不是可能隐藏所有错误的缩减版本。注意您不能附加到由对象输出流创建的文件,至少在没有特殊处理的情况下不能。很难相信某处没有例外。
  • 感谢您对我的帮助。它不起作用主要是因为我。我想结束这个问题。再次感谢您的尝试。
  • 我已经解决了这个问题。原来是因为向外部存储写入了一个空的ArrayList
猜你喜欢
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多