Java将图像转换为输入流而不创建文件

对于我正在处理的applet,我需要将BufferedImage文件转换为输入流,以便我可以将图像上传到我的MySQL服务器。 最初我使用的是这段代码:

 Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection connection = DriverManager.getConnection(connectionURL, "user", "pass"); psmnt = connection.prepareStatement( "insert into save_image(user, image) values(?,?)"); psmnt.setString(1, username); ImageIO.write(image, "png", new File("C://image.png")); File imageFile = new File("C://image.png"); FileInputStream fis = new FileInputStream(imageFile); psmnt.setBinaryStream(2, (InputStream)fis, (fis.length())); int s = psmnt.executeUpdate(); if(s > 0) { System.out.println("done"); } 

(同时捕获相关的exception)代码挂起在applet尝试将图像保存到计算机的部分。 代码在Eclipse中完美运行,或者每当我从localhost运行applet时,我都认为问题在于applet将文件保存到用户计算机的权限。

我只是想知道是否有办法将图像文件转换为输入流而无需将文件保存到用户的计算机。 我试过用:

 ImageIO.createImageInputStream(image); 

但后来我无法将ImageInputStream转换回InputStream 。 有什么建议?

谢谢!

通常,您将使用ByteArrayOutputStream来实现此目的。 它充当内存中的流。

 ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(image,"png", os); InputStream fis = new ByteArrayInputStream(os.toByteArray()); 

您是否尝试过写入ByteArrayOutputStream ,然后从该数据中创建ByteArrayInputStream以进行读取? (在ByteArrayOutputStream上调用toArray ,然后调用ByteArrayOutputStream的构造函数,它将包装该字节数组。)

小心使用BytArray流:如果图像很大,那么代码将失败。 我没有做太多的applet编码,但有可能temp dir可用于编写(例如File.createTempFile() )。