2009-06-10 21 views
5

मैं serialized ऑब्जेक्ट्स की एक फ़ाइल बनाने के लिए ऑब्जेक्टऑटपुटस्ट्रीम का उपयोग कर रहा हूं। मैं ऑब्जेक्ट इनपुट आउटपुट का उपयोग ऑब्जेक्ट को वापस फाइल से बाहर निकालने के लिए readObject() विधि के साथ करता हूं।ऑब्जेक्ट इनपुटस्ट्रीम त्रुटि

यह पहली बार महान काम करता है। जिसका अर्थ है कि यदि फ़ाइल मौजूद नहीं है और मैं खोलने यह तो वस्तुओं के किसी भी संख्या संलग्न, मैं ObjectInputStream वस्तु और उपयोग सभी वस्तुओं खोल सकते हैं। "अमान्य प्रकार कोड: एसी"

हालांकि, अगर मैं बाद में एक ही फ़ाइल को खोलने (संलग्न विकल्प का उपयोग) और अधिक वस्तुओं को जोड़ने, ObjectInputStream वस्तु एक java.io.StreamCorruptedException हो जाता है त्रुटि जहां नई वस्तुओं शुरू कर देना चाहिए।

क्या कोई और इसमें भाग लेता है? मैं डीटल पुस्तक से कुछ मूल पाठ्यपुस्तक उदाहरणों पर भी वापस गया और अभी भी वही त्रुटि प्राप्त करता हूं।

संपादित करें: मुझे यह मिला - आप बंद होने के बाद एक धारावाहिक धारा के अंत में संलग्न नहीं हो सकते हैं और संलग्न मोड में फिर से खोल सकते हैं। राईट काम करने के लिए दिखाई देगा, लेकिन जब आप फ़ाइल को पढ़ने के लिए जाना बाद में आप एक java.io.StreamCorruptedException मिल जाएगा। "http://mindprod.com/jgloss/gotchas.html#SERIALIZATION"

उत्तर

4

प्रत्येक ऑब्जेक्ट को ऑब्जेक्ट्स की धारा के हिस्से के रूप में क्रमबद्ध किया जाता है, न कि एक व्यक्ति के रूप में। अधिकांश ऑब्जेक्ट्स (लेकिन ज़िप नहीं!) की तरह "ऑब्जेक्ट स्ट्रीम सीरियलाइजेशन प्रोटोकॉल" एक हेडर है। यह हर नई ObjectInputStream केवल फ़ाइल की शुरुआत में ही खोजने की अपेक्षा करता है। इसे स्ट्रीम के बीच में रखकर काम नहीं करेगा। इसके अलावा स्ट्रीम में बैकरेफर भी हैं, इसलिए कोई ऑब्जेक्ट दो बार लिखा नहीं जाता है (जब तक अन्यथा निर्दिष्ट नहीं किया जाता है)।

तो आपको प्रत्येक ObjectOutputStream से मेल खाने के लिए एक नया ObjectInputStream बनाने की आवश्यकता होगी। कुछ आंतरिक बफरिंग, वहाँ यह है कि अगर एक समस्या आप इसे Object(In|Out)putStream दे से पहले धारा काट करने की आवश्यकता होती है।

+0

वहाँ उत्पादन और इनपुट के बीच कोई सीधा संबंध स्ट्रीम यहाँ है। वे उसी दिन या वर्कस्टेशन पर भी नहीं चल सकते हैं। कोई फ़ाइल को जानकारी सहेजता है जो कुछ बाद के बिंदु पर दूसरी प्रक्रिया को खोलना और पढ़ना होता है। –

1

यदि स्ट्रीम के निर्माता और उपभोक्ता स्वतंत्र हैं, तो यह आपके लिए आउटपुट फ़ाइल को हर बार ओवरराइट करने और टाइमस्टैम्प फ़ाइल जोड़ने के लिए समझ में आता है ताकि उपभोक्ता को पुनः लोड करने का समय पता हो।

उदाहरण के लिए,

SomeObject[] obj = new SomeObject[numObjects]; 
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file"); 
out.writeObject(obj); 
out.close(); 
long ts = System.currentTimeMillis(); 
ObjectOutputStream tout = 
     new ObjectOutputStream(new FileOutputStream("timestamp.obj"); 
tout.writeObject(new Long(ts)); 

उपभोक्ता तो timestamp.obj फ़ाइल हर कुछ मिनटों मतदान कर सकते हैं और अगर यह बदल गया है, धारा से SomeObject[] फिर से खोलना।

ObjectInputStream in = 
     new ObjectInputStream(new FileInputStream("timestamp.obj")); 
Long ts = (Long)in.readObject(); 

if (ts > prevts) { 
    ObjectInputStream in2 = new ObjectInputStream(new FileInputStream("file")); 
    SomeObject[] obj = (SomeObject[])in.readObject(); 
    prevts = ts; 
} 
1

ऑब्जेक्टस्ट्रीम में एक शीर्षलेख और पाद लेख होता है। इसमें राज्य की जानकारी भी शामिल है, यानी वह जो लिखता है वह उन वस्तुओं पर आधारित है जो पहले ही लिखे गए हैं।

इस प्रकार आप केवल मौजूदा ऑब्जेक्टस्ट्रीम में शामिल नहीं हो सकते हैं। आप क्या कर सकते फ़ाइल को फिर से लिखने और वस्तुओं हर बार जब आप कर जोड़ सकते हैं या अपने खुद के प्रोटोकॉल के साथ धारा लपेट तो आप लिख सकते हैं/कई धाराओं को सही ढंग से पढ़ा है।

ऑब्जेक्टस्ट्रीम सबसे अच्छा काम करता है जब आप उसी कोड बेस के साथ डेटा को पढ़/लिखते हैं (कक्षाओं के पढ़ने/लिखे गए वर्गों के लिए esp।) ऑब्जेक्टस्ट्रीम को कोड के संस्करणों या विभिन्न अनुप्रयोगों के बीच पोर्टेबल होने के लिए डिज़ाइन नहीं किया गया है।

+0

जब हम किस धारा का इस्तेमाल करते थे ?? उत्तर –

+0

@AnshulParashar ObjectOutputStream और ObjectInputStream करें। –