ResultSet rs1 = null;
String SQL="select a,b,c,d from tab1....";
rs1=statement.executeQuery(SQL)
...............
...............
if(rs1.next())
{
   t=rs1.getInt("d")
   if(t>0)
   {
      java.io.InputStream iStream = rs1.getBinaryStream("c");
       byte bb[] = new byte[t];
         int Be = 0;
         String B = "";
      ...............
      ...............
      ...............
      ResultSet rs2 = null;
     String SQL2=".................";
      rs2=statement.executeQuery(SQL2)
       if(rs2.next())
{
.....................
                  .....................
}
    rs2.getStatement().close();
        while(true)
{
  Be = iStream.read(bb);
if(iByte<=0)
 break;

                B = new String(bb, "GBK");
     ...............................
              ...............................
              ...............................
}
    }
}
rs1.getStatement().close();String sFileName = request.+".html";
        java.io.File file = new java.io.File(sFileName);
        java.io.FileOutputStream fileOut = new java.io.FileOutputStream(file,true);
        fileOut.write(result.getBytes());
        fileOut.close();...................................
.................................注:字段c的类型为LONG RAW型 问题,为何有时候执时是会报 java.sql.SQLException: 流已被关闭但出现这种错误的频率很少。可又要排查这问题,请高手帮一下忙,看为何会出现这种问题。

解决方案 »

  1.   

    java.io.InputStream iStream = rs1.getBinaryStream("c");
    Be = iStream.read(bb);
    上面两条语句你为什么不放在一起呢?
    -----------
    API如下:getBinaryStream
    InputStream getBinaryStream(int columnIndex)
                                throws SQLException以未解释字节的二进制流的形式检索此 ResultSet 对象的当前行中指定列的值。然后,可以按块从流中读取值。此方法尤其适合于检索很大的 LONGVARBINARY 值。 
    注:在获取任何其他列的值之前必须读取返回流中的所有数据。下一次调用获取方法将隐式关闭该流。此外,当调用 InputStream.available 方法时,不管是否存在可用数据,流都可能返回 0。 
    参数:
    columnIndex - 第一个列是 1,第二个列是 2,…… 
    返回:
    以未解释字节的流的形式返回传递数据库列值的 Java 输入流;如果值为 SQL NULL,则返回值为 null 
    抛出: 
    SQLException - 如果发生数据库访问错误