2015-06-22 11 views
18

में पढ़ा ++ मैं एक सी ++ कार्यक्रम है एक्सटेंशन या पथ के बिना "myfile" की तरह कुछ एक बिंदुमेमोरी मैप फ़ाइल जावा

hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName); 

lpName में उपयोग करता है, यानि कि एक स्मृति मैप की गई फ़ाइल है। मैं WinObj -Browser (WinObj) पथ Sessions\1\BaseNamedObjects\myfile में फ़ाइल ढूंढ सकता हूं। अगर मैं जावा में उस विशेष फ़ाइल पढ़ने की कोशिश, मैं

File file = new File("myfile"); 
FileChannel filechannel = new RandomAccessFile(file, "r").getChannel(); 
MappedByteBuffer buffer = filechannel.map(FileChannel.MapMode.READ_ONLY, 0, filechannel.size()); 

की कोशिश की लेकिन मैं हमेशा एक ही त्रुटि मिलती है: RandomAccessFile आदेश पर निर्दिष्ट फ़ाइल नहीं मिल सकी। शायद एक और फ़ाइल-पहुंच की आवश्यकता है? कौनसा?

जैसा कि मैंने अन्य पदों से समझते हैं, वे हमेशा एक रास्ता और एक विस्तार का उपयोग, हालांकि, मुझे पता नहीं है कि पथ और विस्तार मेरे मामले में हो सकता है ...

मैं क्या देख रहा हूँ, मैं Kernel object namespaces कर्नेल वस्तु नामस्थान

मुझे पता पहुंचने का एक तरीका है, इस JNI उदाहरण (Memorymap using JNI) है, लेकिन मैं इसे सरल रखने के लिए और nio (यहां तक ​​कि यदि संभव हो तो) का उपयोग करना चाहते हैं।

अद्यतन

तो मैं सिर्फ सी # में पूरी बात करने की कोशिश की और यह हास्यास्पद आसान था, मुझे कोड का अधिक से अधिक 5 लाइनों नहीं लिया।

+1

सी ++ प्रोग्राम की वर्तमान कार्यशील निर्देशिका क्या है? वह जगह है जहां फ़ाइल बनाई गई है। यदि आप एक पूर्ण पथ निर्दिष्ट नहीं करते हैं, तो फ़ाइल नाम मौजूदा कार्य निर्देशिका की प्रक्रिया से संबंधित पथ में बनाया गया है। यदि सी ++ और जावा प्रोग्राम की दो कार्यशील निर्देशिका समान नहीं हैं, तो आप वास्तव में सापेक्ष पथ का उपयोग नहीं कर सकते हैं, आपको फ़ाइल को खोजने के लिए, दोनों प्रोग्रामों में एक पूर्ण पथ निर्दिष्ट करना चाहिए। –

+0

@EwinwinBolwidt: हाँ यह अस्तित्व में है, मैंने सवाल में लिखा है कि मैं Winobj ब्राउज़र में जावा ऐप का परीक्षण करते समय उस फ़ाइल तक पहुंच सकता हूं। @ जोचिमपिलबोर्ग: यह 'सी: \ प्रोजेक्ट \ सर्वर \' जैसा कुछ है, बेवकूफ सवाल: फाइल 'एक्सप्लोरर' में दिखाई नहीं दे रही है, लेकिन मुझे लगता है कि यह नहीं होना चाहिए? – rst

+1

फ़ाइल मैपिंग ऑब्जेक्ट फ़ाइल सिस्टम का हिस्सा नहीं है। कार्य निर्देशिका प्रासंगिक नहीं है। आपको 'ओपनफाइल मैपिंग' को भी कॉल करने की आवश्यकता होगी। 'RandomAccessFile' ऐसा नहीं करेगा। –

उत्तर

-1

आपको OpenFileMapping के बजाय CreateFileMapping का उपयोग करने की आवश्यकता है। इस तरह आप डिस्क मैपिंग से जुड़े डिस्क पर एक वास्तविक फ़ाइल बनायेंगे।

नोट: यह ध्यान रखना महत्वपूर्ण है कि नियमित पढ़ने/लिखने के तरीकों का उपयोग एक अलग प्रक्रिया के फ़ाइल मैपिंग के साथ सिंक्रनाइज़ नहीं किया जाएगा। तो आपको अभी भी जावा

+0

मुझे लगता है कि पूछताछ एक मौजूदा मैपिंग खोलना चाहता है, एक अलग प्रक्रिया द्वारा बनाई गई –

+0

@ डेविड हेफरन: हाँ। मैं भी समझ गया। CreateFileMapping एक नया बना देगा या एक मौजूदा फ़ाइल मैपिंग खोल देगा जो एक वास्तविक फ़ाइल पर आधारित है (ओपनफाइल मैपिंग के बजाय जो मौजूदा मैपिंग खोल देगा या कोई नया फाइल जो किसी भी वास्तविक फ़ाइल पर आधारित नहीं है। – Daniel

+0

CreateFileMapping को फ़ाइल हैंडल की आवश्यकता है। ऐसा लगता है कि उपयोगकर्ता उस फ़ाइल हैंडल को प्राप्त करने में सक्षम नहीं होगा। इसलिए, OpenFileMapping की आवश्यकता है। –

1

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

String working dir = System.getProperty("user.dir"); 

और सुनिश्चित करें कि फ़ाइल सही पथ में है।

+0

हाय, यह काम नहीं करेगा, https://msdn.microsoft.com/en-us/library/dd997372%28v=vs.110%29.aspx में "गैर-जारी स्मृति-मैप की गई फ़ाइलें" जांचें। मैं आईपीसी के लिए साझा स्मृति के बारे में बात कर रहा हूं – rst

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