2012-05-07 17 views
13

में सिस्टम ब्लॉक आकार प्राप्त करें मैं सबसे तेज़, सबसे इष्टतम फ़ाइल बचत विधि लिखने की कोशिश कर रहा हूं। जावा में सिस्टम ब्लॉक आकार पाने का कोई तरीका है? System.getProperty("block.size") या कुछ ऐसा कुछ।जावा

+1

इसके लिए कोई सिस्टम प्रॉपर्टी नहीं है, और शुद्ध जावा के माध्यम से जानकारी प्राप्त करने का कोई तरीका नहीं है। यदि यह ऐसी चिंता है तो आपको BufferedWriter या BufferedOutputStream – ControlAltDel

+2

+1 का उपयोग करना चाहिए; अच्छा प्रश्न। लेकिन सिस्टम पर्यावरण से स्टोरेज ब्लॉक आकार प्राप्त करने वाला आईएमओ समझ में नहीं आता है क्योंकि आपके पास विभिन्न प्रकार के स्टोरेज द्वारा समर्थित किसी दिए गए सिस्टम पर कई माउंट पॉइंट हो सकते हैं। – home

+8

यही कारण है कि वे ऑपरेटिंग सिस्टम का निर्माण करते हैं - इन विवरणों से आपको छोड़ने के लिए – ControlAltDel

उत्तर

6

'सबसे तेज़ सबसे इष्टतम तरीका संभव' निश्चित रूप से सबसे बड़ा बफर का उपयोग करके लिखना है; यह सुनिश्चित करने के लिए कि इसका आकार दो की शक्ति है (एक मेगाबाइट दिमाग में आता है); और यह सुनिश्चित करें कि राईट खुद को कर रहे हैं बनाने के लिए बफ़र गठबंधन:

new BufferedOutputStream(new FileOutputStream(file), 1024*1024); 

जब तक आप प्रणाली ब्लॉक आकार, जो आप इस आकार में हो जाएगा अधिक कर रहे हैं, और इसके साथ गठबंधन बने हुए हैं, जिसके द्वारा की गारंटी है BufferedOutputStream, यह जितना इष्टतम है उतना ही है।

आपको FileChannel.transferTo() पर भी ध्यान देना चाहिए, यह ध्यान में रखते हुए कि आपको इसे लूप में कॉल करना होगा, और वास्तविक कार्यान्वयन अब तक निम्न स्तर के ऑपरेटिंग सिस्टम प्राइमेटिव्स (विज्ञापन के विपरीत) का उपयोग नहीं करते हैं, केवल एक ही तरह का पाश आप खुद को लिख सकते हैं।

4

मुझे नहीं लगता कि ऐसा करने के लिए एक जावा कार्य है। हालांकि उस जानकारी को पुनः प्राप्त करने के लिए एक प्रणाली निर्भर तरीका है। इस answer पर एक नज़र डालें। आपको Runtime.exec() का उपयोग करने और डेटा को पार्स करने की आवश्यकता होगी।

+0

लिंक के लिए धन्यवाद। ऐसा लगता है कि यह एक बहुत अच्छा समाधान है। – kentcdodds

3

कोई सिस्टम प्रॉपर्टी नहीं है लेकिन आप जो भी जावा अपनी आवश्यकताओं के लिए उपयोग कर सकते हैं और बाकी आश्वासन दिया है कि यह आपके ओएस/जावा-संस्करण कॉम्बो के लिए सबसे अच्छा है।

यह समाधान तथ्य buf जावा के BufferedXXXStream कक्षाओं में इस्तेमाल धारण करने के लिए डेटा एक protected चर रहा है और नहीं एक private एक कारनामे:

class IdealBlockSize { 
    // You could alternatively use BufferedInputStream and System.in . 
    private static class MyBufferedOS extends BufferedOutputStream { 
     public MyBufferedOS() { super(System.out); } 
     public MyBufferedOS(OutputStream out) { super(out); } 
     public int bufferSize() { return buf.length; } 
    } 

    public static int VALUE = new IdealBlockSize.MyBufferedOS().bufferSize(); 
} 

उसके बाद, आप, आपके आवेदन स्टार्टअप कोड में उन्हें आह्वान कर सकते हैं की तरह इसलिए:

System.out.printf("Ideal block size: %d\n", IdealBlockSize.VALUE); 

// Output 
// Ideal block size: 8192 

यह समाधान आप बफ़र्स कि सिर्फ काफी बड़ा इष्टतम हो रहे हैं की अनुमति देता है।

+0

आपको 8192 मिलते हैं क्योंकि BufferedOutputStream कन्स्ट्रक्टर में डिफ़ॉल्ट मान को हार्ड कोड किया जाता है। कोई पहचान नहीं की जाती है। मेरा मानना ​​है कि ओपी एक समाधान की तलाश में है जो अंतर्निहित ब्लॉक डिवाइस के आधार पर अपने बफर आकार को अनुकूलित करता है। यदि उसका ब्लॉक डिवाइस (जैसा सामान्य है) 4k गठबंधन है तो यह निश्चित रूप से इष्टतम नहीं होगा। – Dave

+0

8192 की पसंद ऑर्थोगोनल आवश्यकताओं या समझौता बनाम अनुक्रमिक बनाम यादृच्छिक अभिगम और अलग-अलग ऑपरेटिंग सिस्टम विकल्पों में एक समझौता हो सकती है। ओपी तेजी से लिखना चाहता है। क्यों, प्रत्यक्ष आईओ भी सर्वोत्तम हो सकता है और सिंक का उपयोग करते समय एफएस का तार्किक ब्लॉक आकार इष्टतम हो सकता है।बफर आकार को सेट करने के अधिकांश लोगों का अनुभव प्रतिलिपि से आता है, जहां अधिकांश घड़ी का समय वास्तव में पढ़ने में उपयोग किया जाता है। उस स्थिति में ओएस रीड-बफर बफर के कारण बहुत अधिक बफर मदद करते हैं। यह केवल लिखने का मामला नहीं है। – Dave