imageIO.read invoke 错误

本文解决了imageIO.read()处理超大图片时出现的InvocationTargetException异常问题,通过调整JVM内存配置来应对内存不足的情况,提供了Eclipse结合Tomcat及Tomcat独立启动时的内存设置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

imageIO.read() 超大图片上传出现的问题(异常:InvocationTargetException)。

 

这个问题是内存太低导致

设置内存前内存情况:

JVM MAX MEMORY: 64M

JVM IS USING MEMORY:64M

 

 

设置内存后内存情况:

JVM MAX MEMORY: 508M

JVM IS USING MEMORY:508M

 

另:

eclipse 结合tomcat 内存设置和tomcat 独立启动内存设置

1:

Eclipse->Window->Preferences->Server->Runtime Environments->选中Apache Tomcat v5.0->点击Edit按钮->在弹出对话框里点击JRE后面的Installed JREs按钮->在弹出对话框中选中tomcat使用的那个JRE->点击Edit按钮

 

->在弹出对话框中,找到Default VM Arguments,并在输入框中输入:-Xms512M -Xmx512M

 

 

2:

在tomcat/bin 下找到 catalina.bat 文件打开,再找到  set JAVA_OPTS = -Xms512M -Xmx512M

 

 

 

关于堆内存分配:

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最 大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时, JVM会减少堆直到

 

-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。

public void start(Stage primaryStage) throws Exception { String CONNECTION_URL = "jdbc:hive2://192.168.88.100:10000/default"; String USERNAME = "root"; String PASSWORD = "123456"; String JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver"; // 加载 Hive JDBC 驱动 Class.forName(JDBC_DRIVER); // 建立 JDBC 连接 Connection conn = DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD); // 创建 Statement 对象 Statement stmt = conn.createStatement(); // 执行查询语句 String sql = "SELECT data FROM picture_01 WHERE dt = '2023-07-13'"; ResultSet rs = stmt.executeQuery(sql); // 处理查询结果 while (rs.next()) { // 处理数据,例如打印输出 System.out.println(rs.getBinaryStream("data")); } // 从 Hive 数据库获取二进制数据的输入流对象 InputStream inputStream = rs.getBinaryStream("data"); // 将输入流对象转换为 BufferedImage 对象 BufferedImage bufferedImage = ImageIO.read(inputStream); // 转换 BufferedImage 为 JavaFX 的 Image 对象 Image image = SwingFXUtils.toFXImage(bufferedImage, null); System.out.println("1"); // 创建图像视图 ImageView imageView = new ImageView(image); // 创建场景,并将图像视图添加到场景中 Scene scene = new Scene(imageView.getParent()); // 设置舞台并显示场景 primaryStage.setTitle("Image Viewer"); primaryStage.setScene(scene); primaryStage.show(); // 关闭连接和释放资源 rs.close(); stmt.close(); conn.close(); // 关闭输入流 inputStream.close(); } }此代码报错上述代码报错java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)什么原因
最新发布
07-17
可以通过使用反射机制来动态加载图片,从而实现跨平台调用。 首先,在项目中创建一个名为“images”的文件夹,将所有图片文件放在其中。然后,使用反射机制来加载这些图片,代码如下: ``` try { ClassLoader classLoader = getClass().getClassLoader(); I = ImageIO.read(classLoader.getResourceAsStream("images/I.png")); J = ImageIO.read(classLoader.getResourceAsStream("images/J.png")); L = ImageIO.read(classLoader.getResourceAsStream("images/L.png")); O = ImageIO.read(classLoader.getResourceAsStream("images/O.png")); S = ImageIO.read(classLoader.getResourceAsStream("images/S.png")); T = ImageIO.read(classLoader.getResourceAsStream("images/T.png")); Z = ImageIO.read(classLoader.getResourceAsStream("images/Z.png")); backImage = ImageIO.read(classLoader.getResourceAsStream("images/background.png")); } catch (IOException e) { e.printStackTrace(); } ``` 这样,在不同的平台上,只需要将图片文件放在“images”文件夹中,程序就可以自动加载它们,而不需要手动修改代码。 同时,还可以通过添加缓存机制来提高程序的性能,代码如下: ``` private static Map<String, Image> imageCache = new HashMap<>(); public static Image getImage(String path) { if (imageCache.containsKey(path)) { return imageCache.get(path); } else { try { ClassLoader classLoader = getClass().getClassLoader(); Image image = ImageIO.read(classLoader.getResourceAsStream(path)); imageCache.put(path, image); return image; } catch (IOException e) { e.printStackTrace(); return null; } } } ``` 这样,在加载图片时,可以先从缓存中查找,如果存在就直接返回,否则再加载并添加到缓存中,从而提高程序的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值