我尝试通过将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();
}
}
答案 0 :(得分:0)
当您的制作人退出run
方法时,它会关闭所有资源,包括支持ResultSet
的{{1}}。
因此,到InputStream
到达时,没有什么可读的。