2012-04-27 120 views
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(); 
    } 
} 

但這方法不給我所需要的,請幫助我。

+0

爲什麼不「給你[你]需要什麼」? – 2012-04-27 03:25:22

+0

'轉換成文件而不將文件寫入磁盤'是一個矛盾的詞彙。根據定義,文件在磁盤上。問題沒有意義。 – EJP 2012-04-27 10:28:17

回答

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 
+0

ImageIO good one +1 :) – mprabhat 2012-04-27 03:33:39

+0

感謝了很多感知,它工作得很好。 – Harsha 2012-04-27 04:11:46

+0

沒問題,祝你項目好運。 – Perception 2012-04-27 04:23:13

0

您的問題的答案是它的平臺依賴。來自文檔

文件輸出流是用於將數據寫入文件或將數據寫入FileDescriptor的輸出流。無論文件是否可用或可能是否創建了 都取決於底層平臺。一些平臺,特別是在 中,允許一次打開一個文件,以便僅由一個 FileOutputStream(或其他文件寫入對象)來寫入。在這樣的 的情況下,如果涉及的文件 已經打開,此類中的構造函數將失敗。

FileOutputStream用於寫入原始字節流,如 圖像數據。要編寫字符流,請考慮使用 FileWriter。

所以,如果你想寫入一個文件,那麼文件可能會或可能不會被創建。

如果您不想創建文件,而您只是對byte [](文件內容)感興趣,則可以使用@Perception提供的解決方案,或者只傳遞已創建的inputStream。

相關問題