信息检索中的NIO

(来自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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值