1

我需要将生成的图像加载到我的 Java 桌面应用程序中。

我正在使用与此类似的代码:

BufferedImage img = null;
try {
    img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}

它加载的图像,但在更大的图像上我的应用程序刚刚退出。

如何检测我可以加载多大的图像,或者不只是退出?

4

3 回答 3

1

如何检测我可以加载多大的图像,或者不只是退出?

可能有一些库允许您通过读取标题来确定图像的 WxH 和颜色深度,但 J2SE 中的任何内容都不会开箱即用。

另一种“从另一个方向”的方法是采取防御性的方法来装载它们。该技术在此答案的代码中进行了概述,但可以概括为:

  • 保留内存缓冲区
  • 提前准备内存警告面板
  • 执行“内存密集型”任务
  • on OutOfMemoryError:通过清除缓冲区为 VM 提供一些内存“喘息空间”
  • 告诉用户出了什么问题,以及如何解决它
于 2012-09-08T22:49:04.130 回答
1

如果您不在事件调度程序线程中(例如按下 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,则没有理由尝试加载。

于 2012-09-08T23:08:39.357 回答
0

Java 程序具有它们可以使用的最大内存量。我相信最大大小约为 128MB。

希望这对你有帮助!

于 2012-09-08T20:34:51.810 回答