【问题标题】:Writing multiple objects to file将多个对象写入文件
【发布时间】:2014-01-16 09:25:10
【问题描述】:

今天我试图将多个对象写入一个文件。我的对象是两个 String ArrayList,一个 Double ArrayList 和一个 Bitmap。我可以很好地编写所有 ArrayLists 并在另一端检索它们,但是当我将图片添加到文件中时,我得到了 Stream Corrupted Exceptions。这是因为我在一个文件中塞进了太多东西并且字节混乱了吗? 这是我写的:

try {
    fos = openFileOutput(s, Context.MODE_PRIVATE);
        selectedImage = ((BitmapDrawable) addRecipeIcon.getDrawable()).getBitmap();
        selectedImage.compress(Bitmap.CompressFormat.JPEG, 90, fos);

        oos = new ObjectOutputStream(fos);

        oos.writeObject(Ing);
        oos.writeObject(IngN);
        oos.writeObject(Step);

        fos.flush();
        fos.close();
    } 

当我在 DDMS 上写位图和列表时,我注意到数据已被写入(位图+列表),但它没有从另一边出来。

Logcat:

W/System.err(10187): java.io.StreamCorruptedException
W/System.err(10187):    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2109)
W/System.err(10187):    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:372)
W/System.err(10187):    at com.ollygrov.doughpro.Cal.myRecipe(Cal.java:808)
W/System.err(10187):    at com.ollygrov.doughpro.Cal.setDoughInfo(Cal.java:1350)
W/System.err(10187):    at com.ollygrov.doughpro.Cal.onCreate(Cal.java:198)
W/System.err(10187):    at android.app.Activity.performCreate(Activity.java:5104)
W/System.err(10187):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
W/System.err(10187):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
W/System.err(10187):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
W/System.err(10187):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
W/System.err(10187):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
W/System.err(10187):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(10187):    at android.os.Looper.loop(Looper.java:137)
W/System.err(10187):    at android.app.ActivityThread.main(ActivityThread.java:5041)
W/System.err(10187):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(10187):    at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(10187):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
W/System.err(10187):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
W/System.err(10187):    at dalvik.system.NativeStart.main(Native Method)

编辑:供参考。

我实现了我想要的,通过首先将位图序列化为一个字节[]来编写一个位图、两个 ArrayList 和一个 ArrayList,通过 ObjectOutputStream 以特定顺序写入每个对象,然后以相同的顺序加载另一侧.我的订单是:

writeObject.byte[] (Bitmap),
writeObject.ArrayList<Double> (Ing),
writeObject.ArrayList<String> (IngN), 
writeObject.ArrayList<String> (Step),

然后

byte[] b = readObject.byte[],
List 1 = readObject.ArrayList<Double>
List 2 = readObject.ArrayList<String>
List 3 = readObject.ArrayList<String>

【问题讨论】:

  • 为什么不创建新类来保存所有对象并将新对象而不是多个对象存储在单个文件中/
  • 你能在类中添加不同的类型吗?比如位图和双精度和字符串列表?我可以看到使用一种类型的对象是多么简单,但多种对象让我感到困惑
  • 你可以在类中创建任何类型的变量

标签: java file bitmap io outputstream


【解决方案1】:

你可以写一个ArrayList&lt;Object&gt; 或类似你想写入文件的对象,然后再转换回适当的格式。不过,我没有 Android 来测试它。

【讨论】:

  • 谢谢,它可以在同一个列表中使用位图、字符串和双列表吗?
  • 是的,每个类都派生自一个对象,所以它可以工作。但是不要忘记在转换之前检查instanceof 运算符以避免异常。首先将您的字符串和双列表添加到主列表。
  • 当我将位图添加到列表并保存时,它说它是不可序列化的?
  • 哦,是的,我记得我曾经遇到过同样的问题 - 请查看此链接 stackoverflow.com/questions/139996/…
  • jguru.com/faq/view.jsp?EID=32308 也很好地解释了如何序列化图像
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2015-05-15
  • 2018-03-12
  • 1970-01-01
相关资源
最近更新 更多