MappedByteBuffer的学习

package com.taobao.danchen.bytebuffer;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class MappedFile {
    // 文件名
    private String fileName;
    // 文件路径
    private String filePath;
    // 文件对象
    private File file;
    private MappedByteBuffer mappedByteBuffer;
    private FileChannel fileChannel;
    private boolean bundSuccess = false;
    // 文件大小
    private final static long MAX_FILE_SIZE = 1024 * 1024 * 50;
    // 文件写入位置
    private long writePosition = 0;
    // 最后一次刷数据的时间
    private long lastFlushTime;
    // 上一次刷的文件位置
    private long lastFlushFilePosition = 0;
    // 最大的脏数据量,系统必须触发一次强制刷
    private long MAX_FLUSH_DATA_SIZE = 1024 * 512;
    // 最大的时间间隔,系统必须触发一次强制刷
    private long MAX_FLUSH_TIME_GAP = 1000;

    public MappedFile(String fileName, String filePath) {
	super();
	this.fileName = fileName;
	this.filePath = filePath;
	this.file = new File(filePath + "/" + fileName);
	if (!file.exists()) {
	    try {
		file.createNewFile();
	    } catch (IOException e) {
		e.printStackTrace();
	    }
	}
    }

    /**
     * 内存映射文件绑定
     * 
     * @return
     */
    public synchronized boolean boundChannelToByteBuffer() {
	try {
	    RandomAccessFile raf = new RandomAccessFile(file, "rw");
	    this.fileChannel = raf.getChannel();
	} catch (Exception e) {
	    e.printStackTrace();
	    this.bundSuccess = false;
	    return false;
	}
	try {
	    this.mappedByteBuffer = this.fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, MAX_FILE_SIZE);
	} catch (IOException e) {
	    e.printStackTrace();
	    this.bundSuccess = false;
	    return false;
	}
	this.bundSuccess = true;
	return true;
    }

    public synchronized boolean appendData(byte[] data) throws Exception {
	if (!bundSuccess) {
	    throw new Exception("内存映射文件没有建立,请检查...");
	}
	writePosition = writePosition + data.length;
	if (writePosition >= MAX_FILE_SIZE) {
	    flush();
	    writePosition = writePosition - data.length;
	    System.out.println("File=" + file.toURI().toString() + " is writed full.");
	    System.out.println("already write data length:" + writePosition + "max file size=" + MAX_FILE_SIZE);
	    return false;
	}
	this.mappedByteBuffer.put(data);
	// 检测修改量
	if (writePosition - lastFlushFilePosition > this.MAX_FLUSH_DATA_SIZE) {
	    flush();
	}
	// 检测时间间隔
	if (System.currentTimeMillis() - lastFlushTime > this.MAX_FLUSH_TIME_GAP && writePosition > lastFlushFilePosition) {
	    flush();
	}
	return true;
    }

    public synchronized void flush() {
	this.mappedByteBuffer.force();
	this.lastFlushTime = System.currentTimeMillis();
	this.lastFlushFilePosition = writePosition;
    }

    public long getLastFlushTime() {
	return lastFlushTime;
    }

    public String getFileName() {
	return fileName;
    }

    public String getFilePath() {
	return filePath;
    }

    public boolean isBundSuccess() {
	return bundSuccess;
    }

    public File getFile() {
	return file;
    }

    public static long getMaxFileSize() {
	return MAX_FILE_SIZE;
    }

    public long getWritePosition() {
	return writePosition;
    }

    public long getLastFlushFilePosition() {
	return lastFlushFilePosition;
    }

    public long getMAX_FLUSH_DATA_SIZE() {
	return MAX_FLUSH_DATA_SIZE;
    }

    public long getMAX_FLUSH_TIME_GAP() {
	return MAX_FLUSH_TIME_GAP;
    }
}


转载自:http://zhaolinjnu.blog.sohu.com/265626071.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值