我需要将生成的图像加载到我的 Java 桌面应用程序中。
我正在使用与此类似的代码:
BufferedImage img = null;
try {
img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}
它加载的图像,但在更大的图像上我的应用程序刚刚退出。
如何检测我可以加载多大的图像,或者不只是退出?
我需要将生成的图像加载到我的 Java 桌面应用程序中。
我正在使用与此类似的代码:
BufferedImage img = null;
try {
img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}
它加载的图像,但在更大的图像上我的应用程序刚刚退出。
如何检测我可以加载多大的图像,或者不只是退出?
如何检测我可以加载多大的图像,或者不只是退出?
可能有一些库允许您通过读取标题来确定图像的 WxH 和颜色深度,但 J2SE 中的任何内容都不会开箱即用。
另一种“从另一个方向”的方法是采取防御性的方法来装载它们。该技术在此答案的代码中进行了概述,但可以概括为:
OutOfMemoryError
:通过清除缓冲区为 VM 提供一些内存“喘息空间”如果您不在事件调度程序线程中(例如按下 UI 中的按钮),那么您的应用程序将不会崩溃。它会使线程崩溃,线程将被释放,您将无法获得图像,但您的应用程序将处于活动状态。
有可能创建一个线程:或者您将扩展一个线程并覆盖 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 可用空间且文件为 50 MB,则没有理由尝试加载。
Java 程序具有它们可以使用的最大内存量。我相信最大大小约为 128MB。
希望这对你有帮助!