`
543089122
  • 浏览: 153811 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java nio学习笔记<一>

    博客分类:
  • java
阅读更多
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();
	}
}

分享到:
评论

相关推荐

    Java NIO学习笔记——ByteBuffer用法

    ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。ByteBuffer是一个字节缓冲区,可以存储字节序列。在NIO中,所有的数据读写都通过缓冲区进行,ByteBuffer与其他类型的Buffer...

    javaNIO学习笔记

    ### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...

    java学习笔记1(java io/nio)

    java学习笔记1(java io/nio)设计模式

    JAVA NIO学习笔记.docx

    Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一组新的I/O API,它提供了一种不同于传统IO的高效、非阻塞的I/O操作方式。NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统...

    java NIO学习系列 笔记

    Java NIO(New Input/Output)是Java标准库在JDK 1.4版本中引入的一个新特性,它提供了一种不同于传统IO流的高效I/O处理方式。NIO的核心概念包括通道(Channel)和缓冲区(Buffer),这两个组件使得数据以块的形式...

    javaNIO学习笔记(csdn)————程序.pdf

    Java NIO,全称Non-Blocking Input/Output,是非阻塞式输入输出,它是Java从1.4版本开始引入的一种新的I/O模型,为Java程序员提供了处理I/O操作的新方式。NIO的主要特点是其能够使Java程序以更有效的方式处理I/O流,...

    Java JDK 7学习笔记 PDF

    1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过`&lt;&gt;`语法糖使得创建泛型实例更为简洁,例如`List&lt;String&gt; list = new ArrayList&lt;&gt;();` 2. **钻石操作符**:在创建带...

    Javajdk5学习笔记

    以下是对"Javajdk5学习笔记"中可能包含的知识点的详细解析: 1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = ...

    javaNIO.xmind

    自己总结的java中NIO的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    nio demo for nio学习笔记(体系结构以及模块介绍)

    **NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与传统I/O不同的数据处理方式。在传统的IO模型中,数据的读写是阻塞式的,即在读取或写入数据时,程序会暂停执行,等待数据...

    Java基础尚硅谷宋红康学习笔记

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性...通过深入学习和实践,你可以不断提升自己的Java编程能力。

    java超强学习笔记

    "Java超强学习笔记"显然是一份全面且深入的Java学习资料,由一位极具洞察力和组织能力的作者精心编纂。这份笔记可能包含了从基础知识到高级特性的全方位讲解,旨在帮助学习者构建坚实的Java编程基础,并提升他们的...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...

    尚硅谷JAVA基础笔记吐血整理

    “尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...

    良葛格JAVA 学习笔记

    在《JAVA 学习笔记》中,良葛格深入浅出地讲解了Java编程语言的基础知识和进阶技巧,旨在帮助读者从零开始掌握这一广泛应用于企业级开发的重要语言。以下是该学习笔记中可能涵盖的一些核心知识点: 1. **Java基础...

    《java学习》-java学习笔记.zip

    这份《java学习》笔记包含了多个核心主题,旨在帮助初学者和有经验的开发者深入理解和掌握Java技术。 1. **正则表达式(正则.md)**: 正则表达式在Java中用于文本匹配和搜索,是处理字符串的强大工具。Java提供了...

    良葛格Java JDK 5.0学习笔记

    Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。..."良葛格Java JDK 5.0学习笔记"这份资料应该会详细解释这些概念,为初学者提供宝贵的参考资料。

    Java JDK 6学习笔记

    本学习笔记将深入探讨JDK 6中的关键知识点,包括语法改进、API增强、性能优化以及其他重要特性。 一、语法改进 1. 集合初始化简化:JDK 6允许在创建集合时直接通过花括号初始化,如`List&lt;String&gt; list = new ...

Global site tag (gtag.js) - Google Analytics