6

पर जावा आउटपुटस्ट्रीम अपलोड करने के लिए कैसे मैं OutputStream एस के रूप में स्मृति में पीडीएफ दस्तावेज़ बनाते हैं। इन्हें एस 3 पर अपलोड किया जाना चाहिए। मेरी समस्या यह है कि PutObjectRequest को OutputStream से सीधे बनाना संभव नहीं है (this thread in the AWS dev forum के अनुसार)। मैं aws-java-sdk-s3 v1.10.8 का उपयोग Dropwizard ऐप में करता हूं।एडब्ल्यूएस एस 3

दो तरीके दिए मैं अब तक देख सकते हैं कर रहे हैं:

  1. कॉपी OutputStream एक InputStream करने और स्वीकार करते हैं कि दो बार RAM की मात्रा प्रयोग किया जाता है।
  2. पाइप एक InputStream करने के लिए OutputStream और एक अतिरिक्त धागे की भूमि के ऊपर स्वीकार करते हैं (this answer देख)

मैं मैं # 1 के साथ जाना होगा एक बेहतर समाधान नहीं मिल रहा है, तो है क्योंकि यह लग रहा है के रूप में अगर मैं मेरे सेटअप में थ्रेड/सीपीयू की तुलना में अतिरिक्त मेमोरी को अधिक आसानी से बर्दाश्त कर सकता है।

क्या कोई और संभवतः अधिक कुशल तरीका है जिसे मैंने अभी तक अनदेखा किया है?

संपादित करें: मेरे OutputStream रों हैं ByteArrayOutputStream रों

+0

"मैं OutputStreams के रूप में स्मृति में पीडीएफ दस्तावेज़ भी बना" - ?? एक 'आउटपुटस्ट्रीम' डेटा स्टोर नहीं करता है (संभवतः 'बाइटएरे ऑटपुटस्ट्रीम' को छोड़कर, लेकिन फिर आप कहेंगे कि आपने इसे * बाइट सरणी * के रूप में स्मृति में बनाया है) – immibis

+0

मैं बाइटएरे ऑटपुटस्ट्रीम का उपयोग करता हूं। गलतफहमी के लिए खेद है। – EagleBeak

+0

मेरे पास एक समान प्रश्न है - http://stackoverflow.com/questions/40268320/how-to-store-object-on-s3-using-outputstream। क्या आप इसके लिए समाधान ढूंढ पाएंगे? यदि नहीं, तो आप अपने मामले में # 1 करने के बारे में कैसे गए? – Omnipresent

उत्तर

2

मैं ConvertibleOutputStream उपवर्गीकरण द्वारा इस हल:

public class ConvertibleOutputStream extends ByteArrayOutputStream { 
    //Craetes InputStream without actually copying the buffer and using up mem for that. 
    public InputStream toInputStream(){ 
     return new ByteArrayInputStream(buf, 0, count); 
    } 
} 
+0

इसे 'नया बाइटएरे इनपुट इनपुट (बीएफ, 0, गिनती) वापस करने के लिए बदलना होगा; ', अन्यथा' buf' में आवंटित डेटा को इनपुटस्ट्रीम में वास्तविक डेटा के रूप में माना जा सकता है। –

1

अपने OutputStream की वास्तविक प्रकार क्या है? चूंकि यह एक अमूर्त वर्ग है, वहां कोई कह नहीं है कि डेटा वास्तव में कहां जाता है (या यदि यह कहीं भी जाता है)।

लेकिन मान लें कि आप ByteArrayOutputStream के बारे में बात कर रहे हैं क्योंकि यह कम से कम डेटा को स्मृति में रखता है (कई अन्य लोगों के विपरीत)।

यदि आप अपने बफर से ByteArrayInputStream बनाते हैं, तो कोई डुप्लीकेट मेमोरी नहीं है। स्ट्रीमिंग का यही विचार है।

+1

ठीक है, और आप कैसे सुझाव देंगे कि मुझे बफर का उपयोग करना चाहिए? क्या आप उप-वर्ग बनाने और 'ByteArrayOutputStream' से सुरक्षित फ़ील्ड' buf' के लिए सार्वजनिक गेटर प्रदान करने की सलाह देंगे? – EagleBeak

+0

एह, मुझे एहसास नहीं हुआ कि बीएओएस बफर की एक प्रति 'toByteArray' के साथ बनाता है। हाँ, आपको सबक्लास मार्ग के लिए जाना चाहिए। – Kayaman

+0

बिल्कुल, इसलिए सबक्लास विचार। – EagleBeak

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