我需要将生成的图像加载到我的Java桌面应用程序中。
我使用的代码与此相似:
BufferedImage img = null;
try {
img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}
它加载的图像,但在更大的图像,我的应用程序只是退出。
如何检测我可以加载多大的图像,或者不仅仅是退出?
答案 0 :(得分:1)
如何检测我可以加载多大的图像,或者不仅仅是退出?
可能有一些库允许您通过读取标题来确定图像的WxH和颜色深度,但J2SE中的任何内容都不会开箱即用。
“从另一个方向”的另一种方法是采取防御性方法来加载它们。 this answer中的代码概述了此技术,但可归纳为:
OutOfMemoryError
:通过清除缓冲区为VM提供一些内存“呼吸空间”答案 1 :(得分:1)
如果您不在事件调度程序线程中(例如,当按下UI中的按钮时),您的应用程序将不会崩溃。它将崩溃线程,它将被解除分配,你将无法获得图像,但你的应用程序将活着。
有可能创建一个Thread:或者您将扩展一个Thread并覆盖run()方法或创建一个Runnable接口并将其提供给一个线程构造函数。
BufferedImage img = null;
try {
img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}catch(OutOfMemoryError err){
// your code will be here :)
}
在输入加载图片功能之前尝试调试/记录您的代码,看看你的最大可分配内存是多少:
// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();
// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();
// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();
如果你有50 MB空闲且文件是50MB,那么没有理由尝试加载。
答案 2 :(得分:0)
Java程序可以使用最大量的内存。 我相信最大尺寸大约是128MB。
希望这能帮到你!