java基础---->java中nio的使用(一)
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();
}
}
友情链接
- nio的基础概念及使用: http://blog.csdn.net/qq_21430549/article/details/52145008
- 比较详细的nio说明: http://blog.csdn.net/tzs_1041218129/article/details/54917857
java基础---->java中nio的使用(一)的更多相关文章
- Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java基础学习中一些词语和语句的使用
在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.
- Java基础-Java中的并法库之线程池技术
Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java基础__Java中自定义集合类
Java基础__Java中集合类 传送门 自定义MyArrayList集合实现:增加数据.取数据.查看集合中数据个数方法 package com.Gary; public class MyArrayL ...
- Java基础(中)
面向对象基础 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同: 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题. 面向对象会先抽象出对象,然后用对象执行方法的方式 ...
随机推荐
- log4cpp基础测试
// log4cplus.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #include <iostream>#include ...
- 线程池c3p0和dbcp2的配置初始化实例
一.c3p0 public class ConnectionManager { public static ComboPooledDataSource dataSource; static { try ...
- js操作cookie的一些注意项
这两天做购物车逻辑.依照通常的做法,把预购信息存放在cookie里,结果发生了非常多不可理喻的事情,完整的证明了我对cookie的无知. . . 这么多年.非常少用cookie,由于认为它不安全 ...
- CWidgetMgr---H
/************************************************************************/ //管理部件 //部件自动根据Z顺序调整消息的优先 ...
- 每日英语:Risk-Averse Culture Infects U.S. Workers, Entrepreneurs
Americans have long taken pride on their willingness to bet it all on a dream. But that risk-taking ...
- SAP ERP 6.0 EHP7 SR2(WINDOWS MSSQL版)安装说明
原文 by 枫竹丹青 ⋅ 1.安装准备 1.1.版本说明 本文是描述在一个Windows虚拟机.SQL Server数据库环境下,安装SAP ERP 6.0 EHP7 SR2服务器,安装完成虚拟机文件 ...
- GPIO 输入—按键检测
这里要用到一定的模电知识.电容两端电压不能突变,电感两端电流不能突变.这里利用了电容的放电延时实现硬件消抖.按键按下会有抖动,波形有毛刺,使得高低电平显现不明显,而按键按下时,电容放电一下,马上又被充 ...
- JSF request参数传递
转载自:http://blog.csdn.net/duankaige/article/details/6711044 1:JSF页面之间传参 方法1: <h:outputLink value=& ...
- 扩展RBAC用户角色权限设计方案<转>
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- Vim快捷键操作命令大全
Vim是一个超牛的编辑器,命令功能十分强大 .而且这些命令大都可以进行组合 ,比如,9yy命令表示复制9行内容,9表示要复制的行数,同样100dd表示删除100行,当数字和命令合作的时候,就比 ...