java中的IO分许多种
具体介绍请往这走http://blog.51cto.com/stevex/1284437
java IO 中的NIO的英译名为(new IO ) 他是的出现时在JDK1.4版本才有的。
NIO 的它实则是一种非阻塞的IO,它是一种基于缓存区的IO读写。
以前的BIO是一种基于流的读写。每次读写都消耗一个字节数据。而NIO则是一种面向块的读写。每次读写都消耗一个数据块。在操作的速度上要比BIO快许多。
二、使用NIO
首先介绍一下NIO的必须要知道的几个词汇
1.通道 2.缓冲区
通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们。
通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象。一个 Buffer 实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。
NIO同时支持多路IO复用。(多个通道连接到同一个缓冲区)
NIO中程序操作的是缓冲区。文件的读取步骤将缓冲区中的数据读取全部读取到。然后将缓冲区中的缓存内容清除。NIO中文件写入操作则是将缓存中的缓存内容写入到文件中去。
· 以下是一个基于BIO的简单文件拷贝的实现。
package com.demo.io.nio; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileChannelTest { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("C:\\Users\\Desktop\\test.jsp"); FileChannel foc = new FileOutputStream("C:\\Users\\Desktop\\test.txt").getChannel(); FileChannel fic = fis.getChannel(); //创建一个缓冲区大小为48的ByteBuffer ByteBuffer bb = ByteBuffer.allocate(2); int br = 0; while((br=fic.read(bb))!= -1) { //bb.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据 bb.flip(); //告诉当前位置和极限之间是否存在任何元素(此缓冲区中有元素) while(bb.hasRemaining()) { foc.write(bb); } System.out.println(); //缓存满了就会清理缓存 bb.clear(); } fic.close(); fis.close(); } }
三、简单的文件操作
操作流程图:
代码:
public class NIOFileChannel { public static void main(String[] args) throws IOException { String str = "hello world"; // 创建一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("C:\\file\\file01.txt"); // 使用输出流获取到对应的FileChannel FileChannel fileChannel = fileOutputStream.getChannel(); // 创建一个缓冲区 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); // 将要写入的数据放入byteBuffer中 byteBuffer.put(str.getBytes()); // 反转ByteBuffer byteBuffer.flip(); // 将缓冲区的数据写入通道中 fileChannel.write(byteBuffer); fileChannel.close(); fileOutputStream.close(); } }