2012-09-11 35 views
2

从Oracle列读取BLOB虽然试图从像下面码的BLOB获得的InputStream读取被阻断,InputStream的进入不定等待状态。InputStream读入,同时通过JDBC

我从Jboss的应用服务器上运行的Web应用程序设置此数据和读/写的作品精绝,问题是在使用普通的JDBC运行独立的Java代码。

环境是JDK6,Oracle 10g中。

ResultSet rs = this.stmt.executeQuery(); 
    log.println("ResultSetType: " + (rs != null ? rs.getClass() : null)); 
    while (rs != null && rs.next()) { 
      . . . // read other columns 
      Blob savedBlob = rs.getBlob("PERSISTENCE_BLOB"); 

      long len = savedBlob.length(); 
      log.println("Going to read bytes..." + len); 
      InputStream is = savedBlob.getBinaryStream(); 
      log.println("IS Received..."); 
      log.println("Available : " + is.available()); 
      ObjectInputStream oip = new ObjectInputStream(is); 
      Object obj = oip.readObject(); 
      oip.close(); 
      is.close(); 

      savedBlob.free(); 
. . . 

输出是如下...

ResultSetType: class oracle.jdbc.driver.OracleResultSetImpl 
RowID: XXXXXXXXXXXXXXX // Row is selected and printed properly 
Going to read bytes...6022 
IS Received... 
Available : 0 

但如果我尝试在卡盘如下读..它工作得很好,这是我不希望因为我读序列化对象并想从InputStream中打开ObjectInputStream。

. . .  
ResultSet rs = this.stmt.executeQuery(); 
log.println("ResultSetType: " + (rs != null ? rs.getClass() : null)); 
while (rs != null && rs.next()) { 
    . . .  
    Blob savedBlob = rs.getBlob("PERSISTENCE_BLOB"); 
    long len = savedBlob.length(); 
    int start = 1; 
    int totalBytesRead = 0; 
    int buffSize = 2048; 
    byte[] byteBuff = null; 

    log.println("Going to read bytes..." + len); 
    do { 
     byteBuff = new byte[buffSize]; 
     byteBuff = savedBlob.getBytes(start, buffSize); 
     totalBytesRead += buffSize; 
     log.println(start + "," + buffSize + " #BLOB bytes: " + new String(byteBuff)); 
     start += buffSize; 

     . . . 

    } while (. . .); 
log.println("Total Bytes: " + totalBytesRead); 

输出:

ResultSetType: class oracle.jdbc.driver.OracleResultSetImpl 
Going to read bytes...6022 
1,2048 #BLOB bytes: //......bytes data.......... 
..... 
Total Bytes: 6022 

回答

1

InputStream.available()并不表示你可以读了多少,表示多少它可以返回到你(例如,从一个缓冲区),没有进入一个 - 可能 - 阻止读取操作。

的Javadoc还指出:

注意的是,虽然InputStream的一些实现将流中返回的字节 总数,许多人不会。从来没有 正确使用此方法的返回值来分配旨在保存此流中的所有数据的缓冲区 。

类InputStream可用的方法总是返回0

因此,而不是使用available()为任何类型的指示,只是阅读它(这显然作品由指示你的其他代码)。

+0

感谢马克,但我想使用的InputStream而不是字节块读取。正如我在Jboss中提到相同的代码,但在独立的Java应用程序中使用JDBC时没有提到。 – JMewada

+0

您应该能够使用'InputStream'就好了,这是我的观点。否则,你真的需要演示InputStream是如何失败的,因为你的文章中没有任何内容实际上表明它失败了,只是误解了'available()'的含义。 –

+0

好的。所以当我从Eclipse运行应用程序作为Java应用程序或从命令行运行它时,它只是挂在那里,在可用的最后一个日志行之后什么都不做......我必须手动终止它。 – JMewada