您的位置:首页 > 编程语言 > Java开发

java 的io 和nio的简单读写

2016-02-16 17:07 441 查看
最近遇到多线程文件读取的问题。即把io和nio 简单比较一下:

贴出代码:

//io的读写操作
public static void testIO() throws IOException {
FileInputStream fins= null;
FileOutputStream fouts = null;
try {

File readFile = new File("F:/test/test111.txt");
fins = new FileInputStream(readFile);

File outFile = new File("F:/test/test222.txt");
fouts = new FileOutputStream(outFile);

byte[] bytes = new byte[1024];
while(fins.read(bytes)>0) {
fouts.write(bytes);
}
System.out.println("io操作完成");
}finally {
if (fins != null) {
fins.close();
}
if (fouts != null) {
fouts.close();
}
}
}

//nio 的读写操作
public static void testNio() throws IOException {
FileInputStream fins= null;
FileOutputStream fouts = null;
try {

File f = new File("F:/test/test111.txt");
fins = new FileInputStream(f);
FileChannel readChannel = fins.getChannel();

File outF = new File("F:/test/test222.txt");
fouts = new FileOutputStream(outF);
FileChannel writeChannel = fouts.getChannel();

ByteBuffer bb = ByteBuffer.allocate(1024);

while(true) {
bb.clear();
int i = readChannel.read(bb);
if (i ==-1) {
break;
}

bb.flip();
writeChannel.write(bb);
}
System.out.println("nio操作完成");
}finally {
if (fins != null) {
fins.close();
}
if (fouts != null) {
fouts.close();
}
}
}
Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。具体看下面这张图就理解了:

本来以为nio既然是新的io,那么速度肯定还快。其实不然:

摘录网友评论:

在 JDK 1.4 中原来的 I/O 包和 NIO 已经很好地集成了。 java.io.* 已经以 NIO 为基础重新实现了,所以现在它可以利用 NIO 的一些特性。例如, java.io.* 包中的一些类包含以块的形式读写数据的方法,这使得即使在更面向流的系统中,处理速度也会更快。

1.4后的IO经过了集成。所以NIO的好处,集中在其他特性上,而非速度了:

1、分散与聚集读取

2、文件锁定功能

3、网络异步IO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java io