जावा फ़ाइल कॉपी करना (आसान और तेज़)FileChannel#transferTo
जावा मेंप्रतिलिपि फ़ाइलयहां एक नमूना प्रोग्राम है जो इसे प्रदर्शित करता है।
नमूना प्रोग्राम न्यू आई/ओ का उपयोग करता है, जिसे जे2एसई 1.4 में पेश किया गया था। java.nio.channels.FileChannel#transferTo हम इस विधि का उपयोग करेंगे।
इससे आप डेटा को पढ़ने के लिए आवश्यक बफ़र्स की चिंता किए बिना एक कॉपी प्रोग्राम लिख सकते हैं, जिसके परिणामस्वरूप सबसे सरल कोडिंग संभव हो पाती है।
चैनल क्या होता है?
"चैनल" शब्द का प्रयोग विभिन्न अर्थों में किया जाता है।
मूल रूप से, ऐसा लगता है कि यह विभिन्न उपकरणों के बीच डेटा इनपुट और आउटपुट करने के लिए एक ट्रांसमिशन पथ को संदर्भित करता है।java.nio.channels.FileChannel यह क्लास फाइलों से पढ़ने और उनमें लिखने के लिए एक कनेक्शन का प्रतिनिधित्व करती है।
के लिए स्थानांतरण इस विधि के माध्यम से स्रोत फ़ाइल से गंतव्य चैनल तक बाइट डेटा स्थानांतरित किया जा सकता है।
निम्नलिखित उद्धरण जावा एपीआई दस्तावेज़ से लिया गया है।
transferTo(long position, long count, WritableByteChannel target)
यह कमांड इस चैनल पर मौजूद फ़ाइल से बाइट्स को निर्दिष्ट राइटेबल बाइट चैनल में स्थानांतरित करता है।
यह विधि उस साधारण लूप की तुलना में कहीं अधिक कुशल हो सकती है जो इस चैनल से डेटा पढ़ता है और उसे लक्ष्य चैनल पर लिखता है। कई ऑपरेटिंग सिस्टम बाइट्स को कॉपी किए बिना सीधे फाइलसिस्टम कैश से लक्ष्य चैनल पर स्थानांतरित कर सकते हैं।
इस सत्यापन के परिणाम दर्शाते हैं कि नियमित स्ट्रीम का उपयोग करना एक विधि है।
यह विधि फाइलचैनल का उपयोग करने वाली अन्य विधियों (जैसे कि ByteBuffer#allocateDirect विधि का उपयोग करना) की तुलना में तेजी से कॉपी करने की अनुमति देती है।
नमूना कार्यक्रम
फ़ाइलचैनल srcChannel = नया
FileInputStream(srcPath).getChannel();
फ़ाइलचैनल डेस्टचैनल = नया
FileOutputStream(destPath).getChannel();
कोशिश {
srcChannel.transferTo(0, srcChannel.size(), destChannel);
} अंत में {
srcChannel.close();
destChannel.close();
}
}
कार्यान्वयन
सैंपल प्रोग्राम फाइलों को कॉपी करने के लिए, मैंने सी ड्राइव के ठीक नीचे "100M.txt" नाम की 100MB की एक फाइल तैयार की।
नमूना प्रोग्राम में... C:\100M.txt इसे कॉपी करें C:\a.txt निम्न फ़ाइल बनाएं।
नमूने को निम्नलिखित वातावरण में चलाया गया।
ऑपरेटिंग सिस्टम: विंडोज एक्सपी
सीपीयू: एथलॉन 1.46GHz
मेमोरी: 1 जीबी
जेआरई: 1.6.4
◆उदाहरण
/** * निष्पादन उदाहरण * @param args */ public static void main(String[] args) { try { copyTransfer("C:\\100M.txt", "C:\\a.txt"); } catch (IOException e) { e.printStackTrace(); } }
FileChannel#transferTo कॉपी ऑपरेशन में विधियों का उपयोग करना
100MB की फ़ाइल को कॉपी करने की प्रक्रिया लगभग 3 सेकंड में पूरी हो गई। कॉपी करने की प्रक्रिया के दौरान हीप मेमोरी का उपयोग भी लगभग 300 KB था।
वैसे,जावा फ़ाइल कॉपी (बफर आकार बदलना)वहाँ वर्णित विधि,
जब 1000KB के सबसे कुशल बफर आकार को निर्दिष्ट किया गया, तो प्रोसेसिंग का समय लगभग 4 सेकंड था, और हीप का उपयोग लगभग 1,300KB था।
स्ट्रीम-आधारित फ़ाइल कॉपी करने में भी, बफर आकार को समायोजित करके प्रक्रिया को तेज किया जा सकता है।
किसी एक फाइल को कॉपी करने की प्रक्रिया के लिए, दोनों तरीकों में ज्यादा अंतर नहीं है।
हालांकि, जब बड़ी फाइलों को क्रमिक रूप से कॉपी किया जाता है या समानांतर में कई कॉपी ऑपरेशन चलाए जाते हैं, तो प्रोसेसिंग गति और हीप उपयोग के मामले में फाइलचैनल प्रभावी हो सकता है।

