ฉันพยายามที่จะคิดออกว่ามีความแตกต่างในประสิทธิภาพ (หรือข้อดี) เมื่อเราใช้ nio FileChannel
กับปกติFileInputStream/FileOuputStream
เพื่ออ่านและเขียนไฟล์ไปยังระบบไฟล์ ฉันสังเกตว่าบนเครื่องของฉันทั้งสองทำงานที่ระดับเดียวกันหลายครั้งFileChannel
ด้วยวิธีที่ช้ากว่า ฉันขอรายละเอียดเพิ่มเติมเปรียบเทียบสองวิธีนี้ได้ไหม 350MB
นี่คือรหัสที่ผมใช้ไฟล์ที่ฉันกำลังทดสอบกับประมาณ เป็นตัวเลือกที่ดีในการใช้คลาสที่ใช้ NIO สำหรับ File I / O หรือไม่หากฉันไม่ได้ดูที่การเข้าถึงแบบสุ่มหรือคุณสมบัติขั้นสูงอื่น ๆ
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
จะธรรมดากว่าสำหรับการคัดลอกไฟล์ เทคนิคใดก็ตามไม่ควรทำให้ฮาร์ดไดรฟ์ของคุณเร็วขึ้นหรือช้าลง แต่ฉันคิดว่าอาจมีปัญหาหากอ่านชิ้นเล็ก ๆ ในแต่ละครั้งและทำให้หัวใช้เวลาในการค้นหาน้อยเกินไป