Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API,以便提高传输速度。但实际上,在最新的JDK中旧的I/0包已经使用NIO重新实现过了。因此即使我们不显示的编写NIO代码,也能从中获益。速度的提高的文件I/0和网络I/O都有明显的提升。 —-《Java编程思想》

Java NIO提供了与标准IO不同的IO工作方式:

Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

唯一直接与通道交互的缓存器是ByteBuffer。这个类是相当基础的类:通过告知分配多少存储空间来创建一个ByteBuffer对象。

旧I/0类库中有三个类被修改了,用以产生FileChannel。这三类是FileInputStream,FileOutputStream以及可读可写的RandomAccessFile。这三类都是字节操作流,与底层的NIO性质一致。Reader和Writer这种字符模式类不能用于产生通道。但是java.nio.Channels.Channels类提供了实用方法,用以在通道中产生Reader和Writer。

现在我们基于如上三个旧I/0类来产生可写可读的”通道”,并用”缓冲区”来操作:

通过FileOutputStream来写数据:

 public static final  int SIZE = 1024;

public static final String PATH = "/home/wang/hadoopclass.txt";

try {

FileChannel fc = new FileOutputStream(PATH,true).getChannel();

fc.write(ByteBuffer.wrap("Hello World java NIO ".getBytes()));

fc.close();

} catch (IOException e) {}

通过FileInputStream来读数据:

 public static final  int SIZE = 1024;

public static final String PATH = "/home/wang/hadoopclass.txt";
try {

FileChannel fc = new FileInputStream(PATH).getChannel();

ByteBuffer buffer = ByteBuffer.allocate(SIZE);

fc.read(buffer);

//重值ByteBuffer中的数组

buffer.flip();

while (buffer.hasRemaining()){

System.out.println((char)buffer.get());

}

} catch (IOException e) {

e.printStackTrace();

}

通过RandomAccessFile来读写数据:

  try {

FileChannel fc = new FileInputStream(PATH).getChannel();

ByteBuffer buffer = ByteBuffer.allocate(SIZE);

fc.read(buffer);

//重值ByteBuffer中的数组,调用方法后输出通道会从数据的开头而不是末尾开始

buffer.flip();

while (buffer.hasRemaining()){

System.out.println((char)buffer.get());

}

} catch (IOException e) {

e.printStackTrace();

}

这三个类通过getChannel()将会产生一个FileChannel。通道是一种相当基础的东西,可以向它传送用于读写的ByteBuffer,并且可以锁定文件的某些区域用于独占式访问。

如上的代码我们先了解了NIO为何物,下篇博客详细分析Channel以及ByteBuffer。

java NIO之HelloWorld的更多相关文章

  1. 几种Java NIO框架的比较(zz)

    问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina  xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我的印象中.不管是什么NIO ...

  2. JAVA NIO中selectedKeys返回的键集,对其中的SelectionKey执行操作之后,是否需要在selectedKeys()中对其执行remove 操作

    今天一个东西需要用到java nio的东西.在网上查了一下资料,发现有Apache的Mina,Netty等,感觉JDK中带的NIO有点鸡肋啊.之前看过这部分的内容,但好长一段时间没有用,也就忘得七七八 ...

  3. JAVA NIO 之ByteBuffer的mark、position、limit、flip、reset,get方法介绍

    参考博客:http://blog.csdn.net/sunzhenhua0608/article/details/31778519 先来一个demo: import java.nio.ByteBuff ...

  4. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  5. 支撑Java NIO 与 NodeJS的底层技术

    支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...

  6. JAVA NIO学习笔记1 - 架构简介

    最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...

  7. Java NIO概述

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...

  8. JAVA NIO Socket通道

      DatagramChannel和SocketChannel都实现定义读写功能,ServerSocketChannel不实现,只负责监听传入的连接,并建立新的SocketChannel,本身不传输数 ...

  9. JAVA NIO FileChannel 内存映射文件

      文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...

随机推荐

  1. Djangog写XXOO管理的要求以及思路

  2. SQL Server2008 卸载

    先把SQL Server卸载,再把安装时产生的“Microsoft SQL Server”文件夹删掉,在运行注册表,把HKEY_CURRENT_USER\Software\Microsoft\Micr ...

  3. Python中输入和输出(打印)数据

    一个程序要进行交互,就需要进行输入,进行输入→处理→输出的过程.所以就需要用到输入和输出功能.同样的,在Python中,怎么实现输入和输出? Python3中的输入方式: Python提供了 inpu ...

  4. 常用命令4-文件搜索命令 2- whereis

    whereis比较局限,只能查看系统命令.

  5. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  6. Leetcode876.Middle of the Linked List链表的中间节点

    给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4 ...

  7. mysql更改密码

    mysql command line client输入密码以后闪退问题的解决: 网上搜到的解决办法(my.ini文件之类的修改对我都没有起到作用).. 所以觉得是自己密码的问题,因为许久不用这个软件了 ...

  8. 推荐一个好用的git图形化工具

    之前一直用的是SmartGit,虽然贼好用,但是是收费的. 现在看到了一款免费也非常炫酷的工具,忍不住强烈推荐一下GitKraken rebase,cherry pick啥的用挺好用

  9. Sublime Text3 安装less

    1.安装Sublime 插件 (1)安装LESS插件:因为Sublime不支持Less语法高亮,所以,先安装这个插件,方法: ctrl+shift+p>install Package>输入 ...

  10. SQLServer —— 变量的使用

    一.局部变量的定义与赋值 定义语法: -- 声明一个局部变量 DECLARE @变量名 数据类型 -- 声明多个局部变量 DECLARE @变量名1 数据类型1, @变量名2 数据类型2 赋值语法: ...