আমি যখন ফাইল সিস্টেমে ফাইলগুলি পড়তে এবং লিখতে FileChannel
স্বাভাবিকভাবে নিও বনাম ব্যবহার করি তখন পারফরম্যান্সে (বা সুবিধাগুলি) কোনও পার্থক্য রয়েছে কিনা তা আমি খুঁজে বের করার চেষ্টা করছি FileInputStream/FileOuputStream
। আমি পর্যবেক্ষণ করেছি যে আমার মেশিনে উভয়ই একই স্তরের সঞ্চালন করে, FileChannel
বহুগুণে পথটি ধীর হয়। আমি কি দয়া করে এই দুটি পদ্ধতির তুলনায় আরও বিশদ জানতে পারি। আমি যে কোডটি ব্যবহার করেছি তা এখানে, আমি যে ফাইলটি দিয়ে পরীক্ষা করছি তা প্রায় 350MB
। যদি আমি এলোমেলো অ্যাক্সেস বা এ জাতীয় উন্নত বৈশিষ্ট্যগুলি না দেখি তবে ফাইল আই / ওয়ের জন্য এনআইও ভিত্তিক ক্লাসগুলি ব্যবহার করা কি ভাল বিকল্প?
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
ফাইলগুলি অনুলিপি করার জন্য আরও প্রচলিত হবে। যে কোনও কৌশলটি আপনার হার্ড ড্রাইভটিকে কোনও দ্রুত বা ধীর না করা উচিত, যদিও আমি অনুমান করি যে এটি যদি একবারে ছোট ছোট অংশগুলি পড়ে এবং মাথাটি অনাবিল সময় অনুসন্ধানে ব্যয় করে তবে সমস্যা হতে পারে।