2012-10-30 23 views
8

मैं कुछ जावा फ़ाइल हैंडलिंग कोड के लिए परीक्षण लिख रहा हूं और यह सुनिश्चित करना चाहता हूं कि सभी फाइलें ठीक से बंद हो जाएं। मैं 'lsof' नहीं चलाना चाहता क्योंकि इससे अधिक फाइलें खुल जाएंगी और टेस्ट सूट गैर-पोर्टेबल बन जाएगी। किसी को ऐसा करने का कोई तरीका पता है?क्या यह पता लगाने के लिए एक पोर्टेबल तरीका है कि वीएम के अंदर से जेवीएम कितनी फाइलें खुलती है?

+0

यह भी देखें: http://stackoverflow.com/questions/1661322/too-many-open-file-handles – Puce

उत्तर

2

यदि आप जेडीके का हिस्सा कुछ ढूंढ रहे हैं, तो जवाब नहीं है।

आपको कुछ ऐसा लगता है जो JVMTI का उपयोग करता है, लेकिन यह पोर्टेबल नहीं होगा (यह एक मूल इंटरफ़ेस है)। या कुछ ऐसा जो JPDA का उपयोग करता है, लेकिन उसे दूसरी JVM की आवश्यकता होगी। मैं आपको गुगलिंग के लिए शुरुआत के रूप में उन दो शब्दकोष देता हूं।

आप में JVM चलाने के लिए और पोर्टेबल होना चाहते हैं, तो आप अपनी फ़ाइल संदर्भ के लिए एक कारखाने पेश करने का होगा: सभी new FileInputStream(), new FileOutputStream(), new RandomAccessFile(), new FileReader, और new FileWriter कि कारखाने वस्तु पर तरीकों के साथ कॉल की जगह। यह कारखाना इन वस्तुओं के उप-वर्गों को वापस कर देगा, जिनके पास close() विधि ओवरराइड है। यह एक "खुली फाइल" काउंटर भी बढ़ाएगा, जिसे तब ओवरराइड close() द्वारा घटाया जाता है।

फैक्ट्री विधियों और काउंटर को स्थैतिक और सिंक्रनाइज़ करने की आवश्यकता होगी (जब तक कि आप कारखाने को इंजेक्ट नहीं करना चाहते), और यह तय करने के लिए सिस्टम प्रॉपर्टी का उपयोग करना चाहिए कि उप-वर्गीकृत स्ट्रीम या जेडीके संस्करण को वापस करना है या नहीं।

व्यक्तिगत रूप से, मैं टिप्पणी में सलाह लेता हूं, और पहले FindBugs का उपयोग करता हूं।