(来自Reference的总结,侵权删)
传统的I/O以流的方式处理数据,而NIO是以块的方式来处理数据,极大的提升了运行效率。
数据流通形式
从channel到buffer
Buffer
三个状态变量:position,limit, capacity
索引 说明
capacity 缓冲区数组的总长度
position 下一个要操作的数据元素的位置
limit 缓冲区数组中不可操作的下一个元素的位置,limit<=capacity
mark 用于记录当前 position 的前一个位置或者默认是 0
buffer.clear()会将position置为0,而将limit设置为与capacity的值一样。
buffer.flip()会将position置为0,而将limit设置为与之前的flip()的值一样。
读取数据
如果使用原来的 I/O,那么我们只需创建一个 FileInputStream 并从它那里读取。而在 NIO 中,情况稍有不同:我们首先从 FileInputStream 获取一个 Channel 对象,然后使用这个通道来读取数据。
buffer的初始化
buffer需要被分配字节才能使用。
ByteBuffer buffer = ByteBuffer.allocate(字节的大小).
一个int字节的大小可以这样计算 Integer.SIZE / Byte.SIZE
buffer与channel之间的通信
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelUtil {
public static void writeToFileChannel(FileChannel fc, ByteBuffer buffer) {
try {
buffer.flip();
fc.write(buffer);
} catch (IOException e) {
e.printStackTrace();
} finally {
buffer.clear();
}
}
public static void writeToFileChannel(FileChannel fc, ByteBuffer[] buffer) {
for (int i = 0; i < buffer.length; i++) {
buffer[i].flip();
}
try {
fc.write(buffer);
} catch (IOException e) {
e.printStackTrace();
} finally {
for (int i = 0; i < buffer.length; i++) {
buffer[i].clear();
}
}
}
public static void readFromFileChannel(FileChannel fc, ByteBuffer buffer) {
try {
buffer.clear();
fc.read(buffer);
buffer.flip();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readFromFileChannel(FileChannel fc, ByteBuffer[] buffer) {
for (int i = 0; i < buffer.length; i++) {
buffer[i].clear();
}
try {
fc.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < buffer.length; i++) {
buffer[i].flip();
}
}
channel到硬盘
文件操作
一般的文件读取
// 输入一个文件夹路径
File Dir = new File(root)
// 获取所有文件
File[] filelist = Dir.listFiles();
// 对文件进行操作
for (File file : filelist) {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
While ((line = reader.readLine() != null) {
// Get tokens: 移除标点符号并且以空格作为分词依据
String[] tokens = line.trim().split("\\s+");
// 进行特定的操作
}
reader.close();
}
一般的文件写入
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(output,"name")));
writer.write(内容)
writer.close();
从硬盘到Filechannel
RandomAccessFile file = new RandomAccessFile(new File(root), “rw”);
FileChannel channel = file.getChannel();
// 进行特定的操作
file.close();
Reference:
http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html
https://www.ibm.com/developerworks/cn/java/j-lo-javaio/