मैं यह पता लगाने की कोशिश कर रहा हूं कि जब हम फाइल सिस्टम के लिए फाइल पढ़ने और लिखने के लिए नियो FileChannel
बनाम सामान्य FileInputStream/FileOuputStream
का उपयोग करते हैं तो प्रदर्शन (या फायदे) में कोई अंतर होता है या नहीं । मैंने देखा कि मेरी मशीन पर दोनों एक ही स्तर पर प्रदर्शन करते हैं, कई बार FileChannel
रास्ता धीमा भी होता है। क्या मैं इन दोनों तरीकों की तुलना में अधिक जानकारी जान सकता हूं। यहां मैंने जिस कोड का उपयोग किया है, वह फ़ाइल जिसके साथ मैं परीक्षण कर रहा हूं वह आसपास है 350MB
। फ़ाइल I / O के लिए NIO आधारित कक्षाओं का उपयोग करना एक अच्छा विकल्प है, अगर मैं यादृच्छिक अभिगम या अन्य ऐसी उन्नत सुविधाओं को नहीं देख रहा हूँ?
package trialjavaprograms;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class JavaNIOTest {
public static void main(String[] args) throws Exception {
useNormalIO();
useFileChannel();
}
private static void useNormalIO() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
InputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
byte[] buf = new byte[64 * 1024];
int len = 0;
while((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
fos.close();
is.close();
long time2 = System.currentTimeMillis();
System.out.println("Time taken: "+(time2-time1)+" ms");
}
private static void useFileChannel() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
FileInputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
FileChannel f = is.getChannel();
FileChannel f2 = fos.getChannel();
ByteBuffer buf = ByteBuffer.allocateDirect(64 * 1024);
long len = 0;
while((len = f.read(buf)) != -1) {
buf.flip();
f2.write(buf);
buf.clear();
}
f2.close();
f.close();
long time2 = System.currentTimeMillis();
System.out.println("Time taken: "+(time2-time1)+" ms");
}
}
transferTo
/transferFrom
फ़ाइलों की प्रतिलिपि बनाने के लिए अधिक पारंपरिक होगा। जो भी तकनीक आपकी हार्ड ड्राइव को किसी भी तेज या धीमी गति से नहीं करना चाहिए, हालांकि मुझे लगता है कि एक समस्या हो सकती है यदि यह एक बार में छोटे विखंडू को पढ़ती है और सिर को समय की एक विषम राशि खर्च करने का कारण बनती है।