BlockingQueue中的Java ResultSet

时间:2015-01-28 14:45:50

标签: java

我尝试通过将InputStream对象传递给队列,将一些blob从数据库写入磁盘。它创建了大小为0的文件。当我尝试将InputStream写入磁盘而不使用BlockingQueue时,它可以正常工作。 你能帮助我吗? 我的代码如下:

public class ExtractPicture implements Runnable{
    private BlockingQueue<InputStream> queue;
    public ExtractPicture(BlockingQueue<InputStream> queue){
        this.queue = queue;
    }    
    @Override
    public void run() {
        try(Connection conn = new DatabaseConnection().getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("select mypicture from testpicture")){            
            while(rs.next()){
                queue.put(rs.getBinaryStream("mypicture"));
            }  
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
class Consumer implements Runnable{
    private BlockingQueue<InputStream> queue;
    public Consumer(BlockingQueue<InputStream> queue){
        this.queue = queue;
    }
    @Override
    public void run() {
        try{            
            int z = 0;
            InputStream is = null;
//            (is = queue.take()) != null
            while((is = queue.take()) != null){                
                System.out.println("consumer aa" + is.toString());
                writeToDisk(is, "c:\\temp\\p" + z + ".jpeg");
                z++;
            }
            is.close();
        }catch(Exception e){
            e.printStackTrace();
        } 
    }
   private void writeToDisk(InputStream is, String fna){
       OutputStream f = null;
        try {
            f = new FileOutputStream(new File(fna));
            int c = 0;
            while((c = is.read()) > -1){
                f.write(c);
            }
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {

        } finally {
            try {
                f.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
   }
}
class RunService{
     public static void main(String[] args) {
        BlockingQueue<InputStream> queue = new ArrayBlockingQueue(10);
        ExtractPicture ep = new ExtractPicture(queue);
        Consumer c = new Consumer(queue);
        new Thread(ep).start();
        new Thread(c).start();
    }    
}

1 个答案:

答案 0 :(得分:0)

当您的制作人退出run方法时,它会关闭所有资源,包括支持ResultSet的{​​{1}}。 因此,到InputStream到达时,没有什么可读的。