[java]代码库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 fileDirPath;

// 文件对象

private File file;

private MappedByteBuffer mappedByteBuffer;

private FileChannel fileChannel;

private boolean boundSuccess = false;

// 文件最大只能为50MB

private final static long MAX_FILE_SIZE = 1024 * 1024 * 50;

// 最大的脏数据量512KB,系统必须触发一次强制刷

private long MAX_FLUSH_DATA_SIZE = 1024 * 512;

// 最大的刷间隔,系统必须触发一次强制刷

private long MAX_FLUSH_TIME_GAP = 1000;

// 文件写入位置

private long writePosition = 0;

// 最后一次刷数据的时候

private long lastFlushTime;

// 上一次刷的文件位置

private long lastFlushFilePosition = 0;

public MappedFile(String fileName, String fileDirPath) {

super();

this.fileName = fileName;

this.fileDirPath = fileDirPath;

this.file = new File(fileDirPath + "/" + 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.boundSuccess = false;

return false;

}

try {

this.mappedByteBuffer = this.fileChannel

.map(FileChannel.MapMode.READ_WRITE, 0, MAX_FILE_SIZE);

} catch (IOException e) {

e.printStackTrace();

this.boundSuccess = false;

return false;

}

this.boundSuccess = true;

return true;

}

/**

* 写数据:先将之前的文件删除然后重新

* @param data

* @return

*/

public synchronized boolean writeData(byte[] data) {

return false;

}

/**

* 在文件末尾追加数据

* @param data

* @return

* @throws Exception

*/

public synchronized boolean appendData(byte[] data) throws Exception {

if (!boundSuccess) {

boundChannelToByteBuffer();

}

writePosition = writePosition + data.length;

if (writePosition >= MAX_FILE_SIZE) { // 如果写入data会超出文件大小限制,不写入

flush();

writePosition = writePosition - data.length;

System.out.println("File="

+ file.toURI().toString()

+ " is written 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)

||

(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 getFileDirPath() {

return fileDirPath;

}

public boolean isBundSuccess() {

return boundSuccess;

}

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://yuncode.net

java nio 追加写文件_Java NIO在文件末尾追加数据相关推荐

  1. java nio 文件_Java nio 的文件处理

    一.创建一个大文件 下载文件时往往会创建一个指定大小的空文件 package com.lazy.nio; import java.io.IOException; import java.nio.Byt ...

  2. java nio 系列教程 四_Java NIO系列教程(四) Scatter/Gather

    作者:Jakob Jenkov   译者:郭蕾 Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道) ...

  3. java向指定文件继续写内容_java 向指定文件写入内容(如文件存在,则先删除再创建;写入如目录不存在,则创建)...

    /** * 向指定文件写入内容(如文件存在,则先删除再创建写入) * * @param content 保存内容 * @param path 文件完整路径 * @throws IOException ...

  4. java 复制文件_Java中复制文件的4种方法

    Java拷贝文件是一种非常常见的操作.但是java.io.File类没有任何快捷方法可以将文件从源复制到目标文件.在这里,我们将了解学习可以在java中复制文件的四种不同方法. 方法一:使用Strea ...

  5. java 创建新文件_Java创建新文件

    创建文件是一种非常常见的IO操作,在这一小节中我们将学习如何在java中创建文件的几个方法. 在java中创建文件有三种流行的方法,下面将一个一个地来学习. 方法一:使用File.createNewF ...

  6. java 快速读文件_java快速读取文件

    如何优雅读取文件,java想简单读写一个文件都要上10行代码.幸好guava和apache commons 都有提供简单操作文件工具. 简单介绍读取文件最后一行.读取文件第一行.读取大文件.往大文件追 ...

  7. java io流过滤流_JAVA io流 文件流 字节流 字符流 过滤流 缓冲流

    一.概念 1.1.按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 1.2.按数据传输单位分类: 字节流:以字节(8位二进制)为单位进行处理.主要用于读写诸如图 ...

  8. java 文件夹下的文件_java读取某个文件夹下的所有文件

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; public class  ...

  9. java写入dat文件_java写入dat文件

    Java的输入输出包括字节流.文件流.对象流等,要注意区分不同流使用的不同类.字... Java的输入输出包括字节流.文件流.对象流等,要注意区分不同流使用的不同类.字... Java的输入输出包括字 ...

最新文章

  1. Itext导出pdf文件
  2. 三年Java开发,你连基础的JVM运行时内存布局都忘了
  3. Javascript定义类(class)的三种方法
  4. mysql国外专业网站
  5. 利用R语言的Boruta包进行特征选择
  6. HDMI EDID解读
  7. hive(一)hive的安装与基本配置
  8. 计算机io设备是cpu控制的吗,操作系统--IO设备
  9. j2sdk_5_0.exe的使用
  10. 数据库驱动加载失败,数据库连接失败
  11. 【Operator】七大互联网电视牌照商2016年下半年动向之中央三大台
  12. flutter 背景图片毛玻璃效果
  13. 计算机机原理是什么意思,计算机工作原理及与工控机的区别
  14. Redis高可用——主从复制、哨兵模式、集群
  15. 个人选择鼠标过程总结
  16. 腰部减肥3个秘诀 腰围速减2cm
  17. [附源码]java毕业设计郑工校园二手交易平台网站
  18. 了解僵尸网络攻击:什么是僵尸网络,它如何传播恶意软件以及如何保护自己?
  19. 九九重阳节,小草义工到福利院开展尊老敬老爱老助老的活动
  20. Windows快捷命令-应急响应

热门文章

  1. python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
  2. Unet项目解析(3): run_testing.py
  3. Windows2000下Api函数的拦截分析
  4. delphi 中listview的右键菜单处理
  5. ARM Cortex-M3初探
  6. Vulnhub靶机渗透之 AI: Web: 1
  7. Virtual Box上的Ubuntu与Win7共享文件夹
  8. 第一个程序---汇编学习笔记
  9. 【三分钟刷一题力扣】移除元素
  10. 从spring-session存储结构探讨session存储方案的演变