1

我已经在 mysql 数据库中以字节为单位保存了图标大小的图像,现在,我需要做的是从数据库中检索这些文件字节并在 swing 应用程序中显示这些图像,我有一个方法可以从数据库中获取字节并转换它回到一个文件,但我必须将该文件写入磁盘

这是我的方法,

public void downloadFile(int FamerId) throws Exception {
  String sql = "SELECT * FROM images WHERE famer_id=?";
  Connection con = JDBCConnectionPool.getInstance().checkOut();
  PreparedStatement ps = con.prepareStatement(sql);        
  ps.setInt(1, FamerId);
  ResultSet resultSet = ps.executeQuery();

  int count = 0;

  while (resultSet.next()) {
    ByteArrayInputStream bais;
    ObjectInputStream inputStream;

    bais = new ByteArrayInputStream(resultSet.getBytes("image"));
    inputStream = new ObjectInputStream(bais);
    SaveFile sf = (SaveFile) inputStream.readObject();
    FileOutputStream out = new FileOutputStream("fileLocation/" + resultSet.getString("image_name"));
    byte[] bytes = sf.getArray();

    int c = 0;
    while (c < bytes.length) {
      out.write(bytes[c]);
      c++;
    }

    out.close();
    inputStream.close();
    bais.close();            
    JDBCConnectionPool.getInstance().checkOut();
  }
}

但是这种方法不能满足我的需要,请帮助我。

4

2 回答 2

3

ImageIO您可以使用该类直接从字节流中读取图像。当然,假设您之前以兼容的格式写入了图像数据。鉴于在您的代码中读取字节数据时使用中间对象输入流这一事实,这很难说。这是一个如何直接从数据库创建图像而不使用中间文件的示例:

bais = new ByteArrayInputStream(resultSet.getBytes("image"));
final BufferedImage image = ImageIO.read(bais);
// pass the image to your Swing layer to be rendered.

以及如何将数据写入数据库的示例,以便能够使用此代码:

final ByteArrayOutputStream baos = new ByteArrayOutputStream(64000);
ImageIO.write(image, "PNG", baos);
final byte[] data = baos.toByteArray();
// write data to database
于 2012-04-27T03:28:53.503 回答
0

您的问题的答案取决于其平台。从文档

文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或是否可以创建取决于底层平台。特别是某些平台,一次只允许一个 FileOutputStream(或其他文件写入对象)打开一个文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。

FileOutputStream 用于写入原始字节流,例如图像数据。要写入字符流,请考虑使用 FileWriter。

因此,如果您想写入文件,则可能会或可能不会创建文件。

如果您不想创建文件并且您只对 byte[] (文件的内容)感兴趣,那么您可以使用@Perception 提供的解决方案,或者可以只传递您已经创建的 inputStream。

于 2012-04-27T03:32:16.130 回答