package nio;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
/**
* 关于NIO的其他内容可以参考:http://www.iteye.com/topic/834447
* @author Administrator
*
*/
public class ChannelDemo1 {
public static void main(String[] args) throws IOException {
// writeFile("c:\\aaaa.txt");
// readFile("c:\\aaaa.txt");
// readFileByReader("c:\\aaaa.txt");
copy("c:\\aaaa.txt", "c:\\aaaa2.txt");
}
public static void writeFile(String fileName) throws IOException {
/*
* Channel是一个对象(通道),可以通过它读取或写入数据。拿NIO和IO相比较通道就像是流。
* 所有的数据都是通过Buffer来处理,您永远不会将字节直接写入通道中,而是将数据写入缓冲区,读取的话也是将数据读取到缓冲区。
*/
FileChannel fileOutChannel = (new FileOutputStream(fileName, true))
.getChannel();
// 将经过UTF-8编码的字符写入到buffer中,然后通道负责把buffer写入到输出流。
fileOutChannel.write(Charset.forName("utf-8").encode(
CharBuffer.wrap("北京 您好!\n")));
fileOutChannel.close();
}
/*
* 指定InputStreamReader的解析字符集读取文件
*/
public static void readFileByReader(String fileName) throws IOException {
BufferedReader buff = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName), Charset.forName("utf-8")));
String s;
while ((s = buff.readLine()) != null) {
System.out.println(s);
}
buff.close();
}
// nio读取文件
public static void readFile(String fileName) throws IOException {
FileChannel fileInChannel = (new FileInputStream(fileName))
.getChannel();
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
// CharsetEncoder encoder = charset.newEncoder();
/*
* allocateDirect:直接缓冲区,allocate非直接缓冲区, 直接缓冲区是一块连续的内存区域,适合长期驻留内存的数据,
* 非直接缓冲区适合相当于一次性的,适合用完就扔。
*/
ByteBuffer buff = ByteBuffer.allocateDirect(1024);
CharBuffer charBuff = CharBuffer.allocate(1024);
while (fileInChannel.read(buff) != -1) {
// flip用于反转
buff.flip();
// 将字节数组转换成字符数组
decoder.decode(buff, charBuff, false);
charBuff.flip();
System.out.println("read:" + charBuff);
buff.clear();
charBuff.clear();
}
fileInChannel.close();
// 下面代码证明关闭FileChannel也完全关闭了文件句柄
FileChannel fileInChannel11 = (new FileInputStream(fileName))
.getChannel();
System.out.println(fileInChannel11.isOpen());
fileInChannel11.close();
System.out.println(fileInChannel11.isOpen());
}
// nio copy文件
public static void copy(String src, String dest) throws IOException {
FileChannel srcChannel = (new FileInputStream(src)).getChannel();
FileChannel destChannel = (new FileOutputStream(dest)).getChannel();
ByteBuffer buff = ByteBuffer.allocate(1024);
while (true) {
//清空缓冲区,使其可以接受数据
buff.clear();
if (srcChannel.read(buff) == -1) {
break;
}
//将数据读取到缓冲区后,如果要把缓冲区的数据写到通道就要先反转
buff.flip();
destChannel.write(buff);
}
srcChannel.close();
destChannel.close();
}
}
分享到:
相关推荐
ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。ByteBuffer是一个字节缓冲区,可以存储字节序列。在NIO中,所有的数据读写都通过缓冲区进行,ByteBuffer与其他类型的Buffer...
### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...
java学习笔记1(java io/nio)设计模式
Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一组新的I/O API,它提供了一种不同于传统IO的高效、非阻塞的I/O操作方式。NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统...
Java NIO(New Input/Output)是Java标准库在JDK 1.4版本中引入的一个新特性,它提供了一种不同于传统IO流的高效I/O处理方式。NIO的核心概念包括通道(Channel)和缓冲区(Buffer),这两个组件使得数据以块的形式...
Java NIO,全称Non-Blocking Input/Output,是非阻塞式输入输出,它是Java从1.4版本开始引入的一种新的I/O模型,为Java程序员提供了处理I/O操作的新方式。NIO的主要特点是其能够使Java程序以更有效的方式处理I/O流,...
1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过`<>`语法糖使得创建泛型实例更为简洁,例如`List<String> list = new ArrayList<>();` 2. **钻石操作符**:在创建带...
以下是对"Javajdk5学习笔记"中可能包含的知识点的详细解析: 1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = ...
自己总结的java中NIO的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...
**NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与传统I/O不同的数据处理方式。在传统的IO模型中,数据的读写是阻塞式的,即在读取或写入数据时,程序会暂停执行,等待数据...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。
"Java超强学习笔记"显然是一份全面且深入的Java学习资料,由一位极具洞察力和组织能力的作者精心编纂。这份笔记可能包含了从基础知识到高级特性的全方位讲解,旨在帮助学习者构建坚实的Java编程基础,并提升他们的...
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...
“尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...
在《JAVA 学习笔记》中,良葛格深入浅出地讲解了Java编程语言的基础知识和进阶技巧,旨在帮助读者从零开始掌握这一广泛应用于企业级开发的重要语言。以下是该学习笔记中可能涵盖的一些核心知识点: 1. **Java基础...
这份《java学习》笔记包含了多个核心主题,旨在帮助初学者和有经验的开发者深入理解和掌握Java技术。 1. **正则表达式(正则.md)**: 正则表达式在Java中用于文本匹配和搜索,是处理字符串的强大工具。Java提供了...
Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。..."良葛格Java JDK 5.0学习笔记"这份资料应该会详细解释这些概念,为初学者提供宝贵的参考资料。
本学习笔记将深入探讨JDK 6中的关键知识点,包括语法改进、API增强、性能优化以及其他重要特性。 一、语法改进 1. 集合初始化简化:JDK 6允许在创建集合时直接通过花括号初始化,如`List<String> list = new ...