对于我正在处理的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");
}
(同时捕获相关的异常)代码挂起在applet尝试将图像保存到计算机的部分。代码在Eclipse中完美运行,或者每当我从localhost运行applet时,我都认为问题在于applet将文件保存到用户计算机的权限。
我只是想知道是否有办法将图像文件转换为输入流而无需将文件保存到用户的计算机。我尝试使用:
ImageIO.createImageInputStream(image);
但是我无法将ImageInputStream
转换回InputStream
。有什么建议吗?
谢谢!
答案 0 :(得分:27)
通常,您会使用ByteArrayOutputStream来实现此目的。它充当内存中的流。
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image,"png", os);
InputStream fis = new ByteArrayInputStream(os.toByteArray());
答案 1 :(得分:1)
您是否尝试过写入ByteArrayOutputStream
,然后根据该数据创建ByteArrayInputStream
来读取? (在toArray
上调用ByteArrayOutputStream
,然后调用将包装该字节数组的ByteArrayInputStream
构造函数。)
答案 2 :(得分:1)
小心使用BytArray流:如果图像很大,该代码将失败。我没有做太多的applet编码,但是临时目录可能可用于写作(例如File.createTempFile()
)。