FileChannel带缓冲

//1. read the point location
FileChannel channelRead = FileChannel.open(Paths.get("E:\\888.txt"), StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(1024);
channelRead.read(buffer); buffer.flip();    //flip()方法将界限设置到当前位置,位置复位为0,为读入做好准备
while(buffer.hasRemaining()){
    System.out.print((char)buffer.get());
}
System.out.println();
channelRead.close(); //重置为空状态;它并不改变缓冲区中的任何数据元素,而是仅仅将 limit 设为容量的值,并把 position 设回 0
buffer.clear(); //2. write the point location
FileChannel channelWrite = FileChannel.open(Paths.get("E:\\888.txt"), StandardOpenOption.WRITE); //指定容量的缓冲区
//        buffer = ByteBuffer.allocate(1024);
//        buffer.put("测似乎".getBytes()); //对给定数组的缓冲区
buffer = ByteBuffer.wrap("abcdefg  Java开发手册".getBytes());
buffer.limit("abcdefg  Java开发手册".getBytes().length);        //Sets this buffer's limit while(buffer.hasRemaining()){
    channelWrite.write(buffer);
}
channelWrite.close();

ByteBuffer

//1. ByteBuffer
//(1) 读取buffer
ByteBuffer byteBuffer = ByteBuffer.wrap("111 222 333 444 555 666 777".getBytes()); // byteBuffer.flip(); //flip()方法将界限设置到当前位置,位置复位为0,为读入做好准备
while(byteBuffer.hasRemaining()){
System.out.print((char)byteBuffer.get());
}
System.out.println(); //重新读取缓冲区
byteBuffer.rewind();
while(byteBuffer.hasRemaining()){
System.out.print((char)byteBuffer.get());
}
System.out.println(); byteBuffer.rewind(); byteBuffer.position(12); //返回缓冲区的位置
byteBuffer.compact(); //读取position指向的位置和limit直接的值; 丢弃已经释放的数据,保留未释放的数据,并使缓冲区对重新填充容量准备就绪
while(byteBuffer.hasRemaining()){
System.out.print((char)byteBuffer.get());
}
System.out.println(); //(2) 写buffer
byteBuffer = ByteBuffer.wrap("abcdefg Java开发手册".getBytes());
byteBuffer.limit("abcdefg Java开发手册".getBytes().length); //Sets this buffer's limit while(byteBuffer.hasRemaining()){
System.out.println(byteBuffer.get());
} //(3) 转换
byteBuffer.clear();
CharBuffer asCharBuffer = byteBuffer.asCharBuffer();
ByteBuffer asReadOnlyBuffer = byteBuffer.asReadOnlyBuffer(); System.out.println();

CharBuffer

//(1) 读
CharBuffer charBuffer = CharBuffer.wrap("abcdefg Java开发手册".toCharArray()); System.out.println(charBuffer.position());
System.out.println(charBuffer.limit());
System.out.println(charBuffer.toString()); //返回包含此缓冲区中字符的字符串 charBuffer.append("第一期面授培训大纲", charBuffer.position(), charBuffer.position()+"第一期面授培训大纲".length());
System.out.println(charBuffer.position());
System.out.println(charBuffer.limit());
int limit = charBuffer.limit(); charBuffer.flip();
charBuffer.limit(limit); System.out.println(charBuffer.toString());
System.out.println(charBuffer.position());
System.out.println(charBuffer.limit()); //(2) 写 //(3) 转换
charBuffer.clear();
CharBuffer asReadOnlyBuffer2 = charBuffer.asReadOnlyBuffer();

Channel lock/tryLock

//3. 锁机制
//1). 对于一个只读文件通过任意方式加锁时会报NonWritableChannelException异常
//2). 无参lock()默认为独占锁,不会报NonReadableChannelException异常,因为独占就是为了写
//3). 有参lock()为共享锁,所谓的共享也只能读共享,写是独占的,共享锁控制的代码只能是读操作,当有写冲突时会报NonWritableChannelException异常 //(1) 锁定文件, 默认为独占锁, 阻塞的方法, 当文件锁不可用时,当前进程会被挂起
try(FileChannel channel = FileChannel.open(Paths.get("E:\\888.txt"), StandardOpenOption.WRITE);
FileLock lock = channel.lock();
){
ByteBuffer sendBuffer=ByteBuffer.wrap((new Date()+" 写入\n").getBytes());
channel.write(sendBuffer);
lock.release();
} //(2) 锁定文件, 默认为独占锁, 非阻塞的方法, 当文件锁不可用时,tryLock()会得到null值
try(FileChannel channel = FileChannel.open(Paths.get("E:\\888.txt"), StandardOpenOption.WRITE);){
FileLock lock = null;
try{
do{
lock = channel.tryLock();
}while(null==lock); ByteBuffer sendBuffer=ByteBuffer.wrap((new Date()+" 写入\n").getBytes());
channel.write(sendBuffer);
lock.release();
}finally {
if(null!=lock){
lock.close();
}
}
} //release //(3) 锁定部分文件
//shared = true, 表示为共享锁, 多个进程可以读入, 阻止其它获得独占的锁
try(FileChannel channel = FileChannel.open(Paths.get("E:\\888.txt"), StandardOpenOption.WRITE);
FileLock lock = channel.lock(2, 3, false);
){
ByteBuffer sendBuffer=ByteBuffer.wrap((new Date()+" 写入\n").getBytes());
channel.write(sendBuffer);
} //(4) 锁定部分文件
try(FileChannel channel = FileChannel.open(Paths.get("E:\\888.txt"), StandardOpenOption.WRITE);){
FileLock lock = null;
try{
do{
lock = channel.tryLock(2, 3, false);
}while(null==lock); ByteBuffer sendBuffer=ByteBuffer.wrap((new Date()+" 写入\n").getBytes());
channel.write(sendBuffer);
}finally {
if(null!=lock){
lock.close();
}
}
}

J2SE 8的输入输出--缓冲的更多相关文章

  1. C和指针 第十五章 输入输出缓冲

    对于C,所有的I/O操作都只是简单的从程序移进或移出字节,这种字节流便成为流(stream),我们需要关心的只是创建正确的输出字节数据,以及正确的输入读取数据,特定的I/O设备细节都是对程序隐藏的. ...

  2. java IO之 File类+字节流 (输入输出 缓冲流 异常处理)

    1. File类

  3. J2SE 8的输入输出--Path/Paths File/Files; FileSystems 类的用法

    Path的简单用法 //1. Path 正常用法 Path path = Paths.get("src/main/resource/zip"); logger.debug(path ...

  4. J2SE 8的输入输出--序列化

    1. 普通序列化 implements Serializable 继承Serializable接口 class Employee implements Serializable { private S ...

  5. J2SE 8的输入输出--读取/写入文本文件和读取/写入二进制数据

    读取/写入文本文件 // 1. 文本输入 // (1) 短小文本直接转入字符串 String string = new String(Files.readAllBytes(Paths.get(&quo ...

  6. java中的缓冲流!

    package cn.zhozuohou; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...

  7. 【Go语言】I/O专题

    本文目录 1.bytes包:字节切片.Buffer和Reader 1_1.字节切片处理函数 1_1_1.基本处理函数 1_1_2.字节切片比较函数 1_1_3.字节切片前后缀检查函数 1_1_4.字节 ...

  8. A trip through the graphics pipeline 2011 Part 10(翻译)

    之前的几篇翻译都烂尾了,这篇希望....能好些,恩,还有往昔呢. ------------------------------------------------------------- primi ...

  9. (转)Windows驱动编程基础教程

    版权声明     本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...

随机推荐

  1. 来自官方的一些dbt 最佳实践

    限制对原始数据的依赖性 您的项目将取决于存储在数据库中的原始数据.我们建议制作所谓的“基本模型”,以最大限度地减少对原始数据表的依赖性.在此约定中,基本模型可以具有以下职责: 仅选择与当前分析相关的字 ...

  2. STL版本号简单介绍

    说明:本文仅供学习交流.转载请标明出处.欢迎转载! 本文的參考文献为:<STL源代码剖析>侯捷        (1)HP STL:全部STL的祖先版本号,由C++之父Alexander S ...

  3. Linux下的Nginx部署禅道

    基本思路:先安装好nginx和mysql和php,上传禅道的源码.把禅道的源码包扔到 nginx/apache 的工程路径内或者nginx/apache内的配置文件指向nginx的路径,然后将ngin ...

  4. hadoop之 Yarn 调度器Scheduler详解

    概述 集群资源是非常有限的,在多用户.多任务环境下,需要有一个协调者,来保证在有限资源或业务约束下有序调度任务,YARN资源调度器就是这个协调者. YARN调度器有多种实现,自带的调度器为Capaci ...

  5. file-loader 与 url-loader 的区别

    url-loader是对file-loader的一个封装,比如webpack中对图片的加载器配置 {test: /\.(png|jpg)$/, loader: 'url-loader?limit=81 ...

  6. Hadoop集群环境搭建步骤说明

    Hadoop集群环境搭建是很多学习hadoop学习者或者是使用者都必然要面对的一个问题,网上关于hadoop集群环境搭建的博文教程也蛮多的.对于玩hadoop的高手来说肯定没有什么问题,甚至可以说事“ ...

  7. 抓包软件Packet Sniffer的使用

    1. 要用专门的一块zigbee插到底板上,仿真器连到CC Debug接口. 2. 打开软件,按下仿真器的复位键,可以识别到设备. 3. 进行抓包(抓到的是网络中其他节点的信息)

  8. thinkphp mysql和mongodb 完美使用

    thinkphp mysql和mongodb 完美使用.第一步:在你的应用的Model文件下建立一个MonModel如下图第二步:MonModel的内容如下 <?php /** * Create ...

  9. java对含有中文的字符串进行Unicode编码

    public class MyUtil { public static void main(String[] args) throws Exception { String s = "a中a ...

  10. 1048 Find Coins (25 分)

    1048 Find Coins (25 分) Eva loves to collect coins from all over the universe, including some other p ...