【发布时间】:2010-12-08 23:40:01
【问题描述】:
我试图弄清楚当我们使用 nio FileChannel 与普通 FileInputStream/FileOuputStream 来读取和写入文件到文件系统时,性能(或优势)是否有任何差异。我观察到在我的机器上两者的性能相同,而且很多时候FileChannel 的方式更慢。我可以知道比较这两种方法的更多细节吗?这是我使用的代码,我正在测试的文件在350MB 附近。如果我不考虑随机访问或其他此类高级功能,那么将基于 NIO 的类用于文件 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会更传统地用于复制文件。无论哪种技术都不应该使您的硬盘驱动器更快或更慢,尽管我想如果它一次读取小块并导致头部花费过多的时间寻找可能会出现问题。 -
(你没有提到你正在使用哪个操作系统,或者哪个 JRE 供应商和版本。)
-
很抱歉,我正在使用 FC10 和 Sun JDK6。
标签: java optimization file nio operations