将字节数组转换为文件而不将文件写入磁盘

时间:2012-04-27 03:16:42

标签: java swing file

我已经在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();
  }
}

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的问题的答案是依赖于平台。来自文档

  

文件输出流是用于将数据写入File或的输出流   到FileDescriptor。文件是否可用或可能   创建取决于底层平台。一些平台,在   特别是,允许​​只打开一个文件进行写入   FileOutputStream(或其他文件写入对象)一次。在这样的   如果文件,此类中的构造函数将失败   参与已经开放。

     

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

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

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