2009-07-02 14 views
12

में एक ब्लॉब की सामग्री से एक फ़ाइल बनाने के लिए मुझे लगता है मैं फाइल सिस्टम में संग्रहित उन फ़ाइलों करना चाहते हैं ओरेकल 9.स्निपेट जावा

में एक डेटाबेस ब्लॉब स्तंभ में संग्रहीत कुछ फ़ाइलों की है।

यह बहुत आसान होना चाहिए, लेकिन मुझे सही स्निप नहीं मिला है।

मैं जावा में यह कैसे कर सकता हूं?

PreparedStatement ptmst = ... 
ResutlSet rs = pstmt.executeQuery(); 
rs.getBlob(); 
// mistery 
FileOutputStream out = new FileOutputStream(); 
out.write(); // etc et c 

मैं जानता हूँ कि यह ऐसा ही कुछ होना चाहिए ... क्या मैं नहीं जानता कि क्या रहस्य के रूप में टिप्पणी की है

धन्यवाद

संपादित

मैं अंत में है यह डेविड के सवाल से लिया गया है।

यह मेरा आलसी दिया गया है:

PreparedStatement pstmt = connection.prepareStatement("select BINARY from MYTABLE"); 
ResultSet rs = pstmt.executeQuery(); 
while(rs.next()) { 
    Blob blob = rs.getBlob("BINARY"); 
    System.out.println("Read "+ blob.length() + " bytes "); 
    byte [] array = blob.getBytes(1, (int) blob.length()); 
    File file = File.createTempFile("something-", ".binary", new File(".")); 
    FileOutputStream out = new FileOutputStream(file); 
    out.write(array); 
    out.close(); 
} 

उत्तर

18

आप एक InputStream के रूप में ब्लॉब हो और outputstream की सामग्री को डंप करना चाहते हैं। तो 'दुख' की तरह कुछ किया जाना चाहिए: यदि आप पाते हैं अपने आप को इस तरह आईओ बहुत काम कर रही हैं

Blob blob = rs.getBlob(column); 
InputStream in = blob.getBinaryStream(); 
OutputStream out = new FileOutputStream(someFile); 
byte[] buff = new byte[4096]; // how much of the blob to read/write at a time 
int len = 0; 

while ((len = in.read(buff)) != -1) { 
    out.write(buff, 0, len); 
} 

, आप Apache Commons IO का उपयोग कर विवरण की देखभाल करने में लग सकता है। फिर धाराओं को स्थापित करने के बाद सबकुछ बस होगा:

IOUtils.copy(in, out); 
+0

जावा के साथ ओरेकल एक्सएमएल डीबी का उपयोग करके कुछ अच्छी पुरानी यादें वापस लाता है। – pjp

1

एक ही ऑपरेशन को तेज करने का एक और तरीका है। असल में ऊपर का जवाब ठीक काम करता है लेकिन IOUtils.copy(in,out) की तरह बड़े दस्तावेज़ों के लिए बहुत समय लगता है। कारण यह है कि आप अपने ब्लॉब को 4 केबी पुनरावृत्ति द्वारा लिखने की कोशिश कर रहे हैं। सरल समाधान:

Blob blob = rs.getBlob(column); 
InputStream in = blob.getBinaryStream(); 
OutputStream out = new FileOutputStream(someFile); 
byte[] buff = blob.getBytes(1,(int)blob.getLength()); 
out.write(buff); 
out.close(); 

आपका आउटपुटस्ट्रीम एक शॉट में ब्लॉब लिख देगा।

संपादित

क्षमा आरंभिक पोस्ट पर अनुभाग संपादित नहीं देखा।

संबंधित मुद्दे