2012-04-19 12 views
10

हाय मेरे पास स्मृति में एक BufferedImage इंस्टेंस है और इसे प्रदर्शन के लिए I/O ऑपरेशन के बिना बेस 64 स्ट्रिंग के रूप में एन्कोड करने के लिए बाइट [] में परिवर्तित करना चाहते हैं। मैं निम्नलिखित एपीआई का उपयोग किया गया था:BufferedImage को बाइट में कनवर्ट करें [] बिना I/O

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(image,"png",baos); 
return baos.toByteArray(); 

हालांकि, इस एपीआई अभी भी परोक्ष ओएस अस्थायी निर्देशिका, जिस स्थिति में विफलता के लिए नेतृत्व करेंगे करने के लिए छवि कि अंतर्निहित ओएस अस्थायी निर्देशिका भरा है लिखते हैं और अस्थायी फ़ाइल नहीं किया जा सकता बनाया था। स्टैक ट्रेस: ​​

Caused by: java.io.IOException: No space left on device 
    at java.io.RandomAccessFile.write(RandomAccessFile.java:493) 
    at javax.imageio.stream.FileCacheImageOutputStream.write(FileCacheImageOutputStream.java:134) 
    at javax.imageio.stream.ImageOutputStreamImpl.write(ImageOutputStreamImpl.java:66) 
    at com.sun.imageio.plugins.png.PNGImageWriter.write_magic(PNGImageWriter.java:376) 
    at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1115) 
    at javax.imageio.ImageWriter.write(ImageWriter.java:628) 
    at javax.imageio.ImageIO.write(ImageIO.java:1480) 
    at javax.imageio.ImageIO.write(ImageIO.java:1554) 

वहाँ एक कुशल (इन-स्मृति रूपांतरण या कुशल आई/ओ) की तरह जिस तरह से मैं बिना रूपांतरण करने के लिए है/हे? कृपया सलाह दें। जावाडोक के अनुसार

ImageIO.setUseCache(false); 

यह डिफ़ॉल्ट रूप से चालू है:

+3

मैं कर रहा हूँ .. यह कहा जाता है कि ऐसा होता है। –

+0

यह लगभग निश्चित रूप से JVM में एक बग है। क्या आपने नवीनतम संस्करण की कोशिश की है? –

+0

@ पीटर लेवरी: आप इसे एक बग क्यों मानते हैं? एक पूरी कक्षा है ['FileCacheImageOutputStream'] (http://docs.oracle.com/javase/7/docs/api/javax/imageio/stream/FileCacheImageOutputStream.html)। हालांकि मुझे 'इमेजियो' में इस तंत्र से अवगत नहीं था। –

उत्तर

11

ImageIO.setUseCache() विधि के माध्यम से ImageIO कैश अक्षम

एक झंडा यह बताते हैं कि एक डिस्क आधारित कैश फ़ाइल इस्तेमाल किया जाना चाहिए सेट ImageInputStreams और ImageOutputStreams बनाते समय।

मानक इनपुटस्ट्रीम से पढ़ते समय, कैश में पहले पढ़ने वाली जानकारी को सहेजना आवश्यक हो सकता है क्योंकि अंतर्निहित धारा डेटा को फिर से पढ़ने की अनुमति नहीं देती है। इसी तरह, जब मानक आउटपुटस्ट्रीम को लिखते हैं, तो कैश का उपयोग अंतिम गंतव्य पर फ़्लश करने से पहले पहले लिखित मान को बदलने की अनुमति देने के लिए किया जा सकता है।

कैश मुख्य मेमोरी या डिस्क पर रह सकता है। झंडे को इस ध्वज को सेट करने से भविष्य की धाराओं के लिए डिस्क का उपयोग अस्वीकार हो जाता है, जो छोटी छवियों के साथ काम करते समय फायदेमंद हो सकता है, क्योंकि फ़ाइलों को बनाने और नष्ट करने के ऊपरी हिस्से को हटा दिया जाता है।

स्टार्टअप पर, मान सही पर सेट किया गया है।

3

डिफ़ॉल्ट रूप से छविIO लिखता है कि यह केवल डिस्क का उपयोग करते समय भी डिस्क पर कैश है। साथ कैश अक्षम करके देखें:

ImageIO.setUseCache(false); 
1

((DataBufferByte)img.getRaster().getDataBuffer()).getData() स्वचालित रूप से एक बाइट सरणी देता है, तो अपनी छवि एक बाइट प्रारूप में था। किसी भी आईओ के लिए बिल्कुल कोई ज़रूरत नहीं है।

2

ImageIO.setUseCache(false) दोनों का उल्लेख सही है। हालांकि, अगर आप विश्व स्तर पर ImageIO के लिए डिस्क कैशिंग निष्क्रिय करने के लिए पसंद नहीं है, एक विकल्प स्पष्ट रूप से एक MemoryCacheImageOutputStream में धारा (जो डिस्क कैशिंग के बजाय इन-स्मृति कैशिंग करता है) रैप करने के लिए है:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageOutputStream stream = new MemoryCacheImageOutputStream(baos); 
ImageIO.write(image, "png", stream); 
stream.close(); 
return baos.toByteArray(); 
+0

लगता है, यह अब कम से कम 1.8 में सत्य नहीं है। 'com.sun.imageio.spi.OutputStreamImageOutputStreamSpi # createOutputStreamInstance' स्ट्रीम के प्रकार की जांच नहीं करता है लेकिन 'useCache' पैरामीटर की जांच करता है। वैसे भी, स्थानीय स्तर पर कैशिंग अक्षम करने का एक तरीका होना वास्तव में अच्छा होगा। – sedovav

+0

@sedovav उपरोक्त समाधान वास्तव में डिस्क कैश को अक्षम करने "स्थानीय रूप से" के लिए एक तरीका प्रदान करता है। जब आप मेमोरी कैश इमेजऑटपुटस्ट्रीम सीधे बनाते हैं तो आप कभी भी स्पि को नहीं दबाते हैं, इसलिए जो कुछ भी करता है वह अप्रासंगिक है। पीएस: ध्यान दें कि ImageOutputSream इसके नाम के बावजूद आउटपुटस्ट्रीम का उप-वर्ग नहीं है। और इसके लिए ImageIO.write का एक अलग ओवरलोड है। वास्तव में – haraldK

+1

। आपका बहुत बहुत धन्यवाद! – sedovav

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

  • कोई संबंधित समस्या नहीं^_^