JDK 1.4 中引入的新输入输出 (NIO) 库在标准 Java 代码中提供了高速的、面向块的 I/O。今天我们就简单的学习一下nio的知识。我笑,便面如春花,定是能感动人的,任他是谁。

nio的简单使用

FileInputStream、FileOutputStream和RandomAccessFile用于产生FileChannel。这些字节操纵流,与底层的nio特性一致。

一、FileChannel的产生

public void nioTest_1() {
final int BUFFER_SIZE = 1024;
try {
// 向文件里面写入数据
FileChannel fc = new FileOutputStream("file/linux.txt").getChannel();
fc.write(ByteBuffer.wrap("I love you".getBytes()));
fc.close(); // 向文件里面追加数据
fc = new RandomAccessFile("file/linux.txt", "rw").getChannel();
System.out.println(fc.position()); //
fc.position(fc.size());
fc.write(ByteBuffer.wrap(", china.".getBytes()));
fc.close(); // 向文件里面读取数据
fc = new FileInputStream("file/linux.txt").getChannel();
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
fc.read(buffer);
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get()); // I love you, china.
}
} catch (Exception e) {
e.printStackTrace();
}
}

二、文件的复制功能

public void nioTest_2() {
final int BUFFER_SIZE = 1024;
try {
FileChannel out = new FileOutputStream("file/huhx.txt").getChannel();
FileChannel in = new FileInputStream("file/linux.txt").getChannel();
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); while (in.read(buffer) != -1) {
buffer.flip(); // 准备写数据
out.write(buffer);
buffer.clear(); // 准备读数据
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}

关于文件的复制,jdk提供了一个简单的方法实现。

public void nioTest_3() {
final int BUFFER_SIZE = 1024;
try {
FileChannel out = new FileOutputStream("file/huhx.txt").getChannel();
FileChannel in = new FileInputStream("file/linux.txt").getChannel();
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); in.transferTo(0, in.size(), out);
// out.transferFrom(in, 0, in.size()); 这个和上述实现的目标是一样的。
} catch (Exception e) {
e.printStackTrace();
}
}

三、buffer之间的转换

public void nioTest_4() {
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{0, 0, 0, 0, 0, 0, 0, 'a'});
buffer.rewind();
System.out.println("Byte Buffer");
while (buffer.hasRemaining()) {
System.out.println(buffer.position() + " -> " + buffer.get());
} IntBuffer intBuffer = ((ByteBuffer) buffer.rewind()).asIntBuffer();
System.out.println("Int Buffer");
while (intBuffer.hasRemaining()) {
System.out.println(intBuffer.position() + " -> " + intBuffer.get());
} CharBuffer charBuffer = ((ByteBuffer) buffer.rewind()).asCharBuffer();
System.out.println("Char Buffer");
while (charBuffer.hasRemaining()) {
System.out.println(charBuffer.position() + " -> " + charBuffer.get());
}
}

运行的效果:

Byte Buffer
->
->
->
->
->
->
->
->
Int Buffer
->
->
Char Buffer
->
->
->
-> a

四、存储器映射文件

public void nioTest_6() {
final int length = 0x8FFFFFF;
try {
MappedByteBuffer out = new RandomAccessFile("file/huhx.txt", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);
for (int i = 0; i < length; i++) {
out.put((byte) 'x');
}
System.out.println("Finishing writing");
for (int i = length / 2; i < length / 2 + 6; i++) {
System.out.print((char) out.get(i));
}
} catch (Exception e) {
e.printStackTrace();
}
}

五、文件加锁

public void nioTest_7() {
try {
FileOutputStream fos = new FileOutputStream("file/huhx.txt", false);
FileLock fileLock = fos.getChannel().tryLock();
if (fileLock != null) {
System.out.println("Locked File");
Thread.sleep(1000);
fos.write("hello world".getBytes());
fileLock.release();
System.out.println("Released Lock");
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}

友情链接

java基础---->java中nio的使用(一)的更多相关文章

  1. Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

    Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

  2. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  3. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  4. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  6. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  7. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  8. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  9. Java基础__Java中自定义集合类

    Java基础__Java中集合类 传送门 自定义MyArrayList集合实现:增加数据.取数据.查看集合中数据个数方法 package com.Gary; public class MyArrayL ...

  10. Java基础(中)

    面向对象基础 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同: 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题. 面向对象会先抽象出对象,然后用对象执行方法的方式 ...

随机推荐

  1. HTML十进制字符编号

    有时候写文章时,段落里引用的代码莫名的就被解释到原本的html中了,通过用一些HTML里特殊字符的编码即可回到原文,保留原格式. 字符 十进制字符编号 实体名字 说明 ! ! — 惊叹号Exclama ...

  2. Node.js验证码模块captchapng

    captchapng是一个基于pnglib模块开发,数字型验证码模块.内置字体.全JavaScript无其它依赖.不像有的验证码需要依赖canvas或者是需要编译,而且captchapng使用起来简单 ...

  3. java开发常用到的jar包总结

    commons-io.jar: FileUtils 读取文件所有行 File file = new File("c:\\123.txt"); List<String> ...

  4. 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 网上有好几种单页应用转seo的方案,有服务端渲染ssr.有预渲染prerender.google抓AJAX.静态化...这些方案都各有优劣,开发者可以根据不同的 ...

  5. tornado异步web请求

    1.为什么要使用异步web服务使用异步非阻塞请求,并发处理更高效. 2.同步与异步请求比较同步请求时,web服务器进程是阻塞的,也就是说当一个请求被处理时,服务器进程会被挂起直至请求完成. 异步请求时 ...

  6. 一款jquery和css3实现的卡通人物动画特效

    之前为大家分享了很多jquery和css3的动画实例.今天给大家带来一款非常炫的jquery和css3实现的卡通人物动画特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: < ...

  7. osgi实战学习之路:6. Service-1

    什么是Service? 它是注冊到osgi的一个java对象 Service注冊: 通过BundleContext::registerService(java.lang.String[] clazze ...

  8. EmWebAdmin 初步上手

    EmWebAdmin 简介: // github 地址: https://github.com/ZengjfOS/EmWebAdmin // 介绍: 参考gentelella做的模板: 这是一个PHP ...

  9. 大数据(12) - Scala安装与IDE相关配置

    一  Scala简述 统计世界top100大学计算机系年级前三名,从初中开始编程,学过20多种语言,最后认为Scala最难.好了,我们开始享受这个过程把:). 二  Scala安装与配置 Scala需 ...

  10. loadOnStartup = 1

    在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet.当值为0或者大于 ...