先看使用,源码之后再说。
nio提高文件的速度,使用的结构更类似于操作系统执行IO的方式:通道和缓冲器
通道是FileChannel、缓冲器是ByteBuffer
FileInputStream、FileOutputStream、RandomAccessFile使用的是字节流
Reader和Writer是字符流,因此不能用于产生通道。
写文件:
FileChannel fc = new FileOutputStream("data.txt").getChannel();
fc.write(ByteBuffer.wrap("some text").getBytes());
fc.close()
写文件
fc = new RandomAccessFile("data.txt" , "rw");
fc.position(fc.size());
fc.write(ByteBuffer.wrap("some more").getBytes());//写之后,信息仍在缓冲区中,如果后续还需要从buffer读数据,则这里,在写之后,加上buffer.clear()
fc.close();
读文件
fc = new FileInputStream("data.txt").getChannel();
ByteBuffer buff = ByteBuffer.allocate(1024);//fc.size()
fc.read(buff);
buff.flip();//这里读之前,必须flip,让缓冲器做好读数据的准备
while(buff.hasRemaining()){
System.out.println((char) buff.get());
}
文件复制demo
FileChannel in = new FileInputStream("in.txt").getChannel();
FileChannel out = new FileInputStream("out.txt").getChannel();
ByteBuffer buff = ByteBuffer.allocate(1024);
while(in.read(buffer) != -1){
buffer.flip();
out.write(buffer);
buffer.clear();
}