Java 如何将位图阵列列表保存到文件

Java 如何将位图阵列列表保存到文件,java,android,image,list,bitmap,Java,Android,Image,List,Bitmap,我正在尝试将位图列表保存到文件中。基本上,我想把它保存起来以备将来参考,这样当用户从图库中选择图像时,即使应用程序关闭,它也会留在图库中 这就是我想做的?但是得到了一些异常-BufferUnderFlowException,OutOfMemoryException。问题似乎是位图列表的内存非常大。有没有更好的办法 final List<Bitmap> bitmapcontent=new ArrayList<Bitmap>(); ImageView i

我正在尝试将位图列表保存到文件中。基本上,我想把它保存起来以备将来参考,这样当用户从图库中选择图像时,即使应用程序关闭,它也会留在图库中

这就是我想做的?但是得到了一些异常-BufferUnderFlowException,OutOfMemoryException。问题似乎是位图列表的内存非常大。有没有更好的办法

    final   List<Bitmap> bitmapcontent=new ArrayList<Bitmap>();
     ImageView imageView;
Gallery gallery;

private static byte[] bytesar;
ByteBuffer dst;
private void savethebitmap() throws IOException, ClassNotFoundException {

    try {
        FileOutputStream fos = openFileOutput("bitmapimage", Context.MODE_PRIVATE);
        ObjectOutputStream out=new ObjectOutputStream(fos);
        out.writeInt(bitmapcontent.size());

        for(int i=0;i<bitmapcontent.size();i++){

            out.writeInt(bitmapcontent.get(i).getRowBytes());
            out.writeInt(bitmapcontent.get(i).getHeight());
            out.writeInt(bitmapcontent.get(i).getWidth());


            int bmSize = bitmapcontent.get(i).getRowBytes() * bitmapcontent.get(i).getHeight();
            if(dst==null || bmSize > dst.capacity())
                dst= ByteBuffer.allocate(bmSize);

            out.writeInt(dst.capacity());
            dst.position(0);

            bitmapcontent.get(i).copyPixelsToBuffer(dst);
            if(bytesar==null || bmSize > bytesar.length)
                bytesar=new byte[bmSize];

            dst.position(0);
            dst.get(bytesar);


            out.write(bytesar, 0, bytesar.length);

        }


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private void loadthebitmap() throws IOException,ClassNotFoundException{

    try {
        freeBitmaps();
        FileInputStream fos = openFileInput("bitmapimage");
        ObjectInputStream in=new ObjectInputStream(fos);
        int size=in.readInt();
        for(int i=0;i<size;i++){

             int height=in.readInt();
                int width=in.readInt();

                int bmSize=in.readInt();




                if(bytesar==null || bmSize > bytesar.length)
                    bytesar= new byte[bmSize];


                int offset=0;

                while(in.available()>0){
                    offset=offset + in.read(bytesar, offset, in.available());
                }

                if(dst==null || bmSize > dst.capacity())
                    dst= ByteBuffer.allocate(bmSize);
                dst.position(0);
                dst.put(bytesar);
                dst.position(0);
            Bitmap    myVideoScreenshotBm=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
                myVideoScreenshotBm.copyPixelsFromBuffer(dst);
             bitmapcontent.add(myVideoScreenshotBm);



        }


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
final List bitmapcontent=new ArrayList();
图像视图图像视图;
画廊;
私有静态字节[]字节;
ByteBuffer dst;
私有void savethebitmap()引发IOException,ClassNotFoundException{
试一试{
FileOutputStream fos=openFileOutput(“bitmapimage”,Context.MODE_PRIVATE);
ObjectOutputStream out=新的ObjectOutputStream(fos);
out.writeInt(bitmapcontent.size());
对于(int i=0;i dst.capacity())
dst=字节缓冲分配(bmSize);
out.writeInt(dst.capacity());
dst位置(0);
bitmapcontent.get(i).copyPixelsToBuffer(dst);
if(字节数==null | | bmSize>bytesar.length)
bytesar=新字节[bmSize];
dst位置(0);
dst.get(bytesar);
out.write(bytesar,0,bytesar.length);
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
private void loadthebitmap()引发IOException,ClassNotFoundException{
试一试{
免费位图();
FileInputStream fos=openFileInput(“位图图像”);
ObjectInputStream in=新的ObjectInputStream(fos);
int size=in.readInt();
for(int i=0;i字节长度)
bytesar=新字节[bmSize];
整数偏移=0;
while(in.available()>0){
offset=offset+in.read(bytesar,offset,in.available());
}
如果(dst==null | | bmSize>dst.capacity())
dst=字节缓冲分配(bmSize);
dst位置(0);
dst.put(bytesar);
dst位置(0);
位图myVideoScreenshotBm=Bitmap.createBitmap(宽度、高度、Bitmap.Config.RGB_565);
myVideoScreenshotBm.copyPixelsFromBuffer(dst);
添加(myVideoScreenshotBm);
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}

可能是arraylist太大,堆无法处理它。尝试使用以下命令启动VM:

-Xmx2G -Xms1G
-Xmx代表最大内存,-Xms代表开始时分配的内存。 G代表GB,M代表MB

回答上面评论中的G_S,他似乎使用了
ObjectOutputStream
来序列化arraylist

编辑:


如果设备内存不足,您可能希望尝试将位图拆分为块。

输出。writeObject(bitmapContent)
和Bob(应该是)您的叔叔。。。如果您的内存不足,请使用建议增加内存大小。还有。祝你一切顺利,让我知道你进展如何

ObjectOutputStream
缓存写入其中的对象。因此,可以使用simple
DataOutputStream
或调用


这是安卓设备,我不知道这么多内存从哪里来。也发布printStackTrace。虽然有帮助,但OutOfMemoryException仍然没有消失。
    out.write(bytesar, 0, bytesar.length);
    out.flush();
    out.reset();