Java NIO2(AIO) 进行文件异步读取

在  NodeJS 中进行异步操作很简单,而 Java 到了  7 开始才支持异步的 IO 操作。虽然之前的版本有引入非阻塞 IO,但编码中还不易体现出它的优越性。亮一下 NodeJS 用异步 IO 的例子:

var fs = require('fs');
fs.readFile('Test.scala', 'utf-8', function(err, data){
  if( !err ) {
    console.log(data);
  }
});

console.log('continue doing other thins');

执行输出是

continue doing other things
CONTENT FROM FILE Test.scala

对的,理想中的异步操作就是,传递回调函数来读取文件,读取完成后招待回调,且不阻塞主线程。

在 Java 8 之前,因为没有 Lambda 支持只能应用内部类的方式。JDK 提供了以下异步 Channel 来实现异步操作

AsynchronousFileChannel 阅读全文 >>

Java NIO 应用 -- 使用内存映射文件实现进程间通信

一看到 Java NIO 的内存映射文件(MappedByteBuffer),让我立即就联想到 Windows 系统的内存映射文件。Windows 系统的内存映射文件能用来在多个进程间共享数据,即进程间的共享内存,是通过把同一块内存区域映射到不同进程的地址空间中,从而达到共享内存。

Java NIO 的内存映射文件和 Windows 系统下的一样,都能把物理文件的内容映射到内存中,那么 MappedByteBuffer 是否能用来在不同 Java 进程(JVM) 间共享数据呢?答案是肯定的,这样在通常的 Socket 方式来实现 Java 进程间通信之上又多了一种方法。 阅读全文 >>

Java NIO 入门学习(读写文件)

我们用原有 IO 读写文件应该不会陌生了,顺带回顾一下,大致两种:

1. 在 InputStream 或 OutputStream 上读写字节或字节数组,读 InputStream 时用是否返回 -1 来判断是否到达末尾。
2. 包装成 Reader/Writer 可以直接读写字符串,进一步包装到 BufferedReader/BufferedWriter 就可以按行读写了。readLine() 时看是否返回 null 断定是否读完了最后一行。

现在我们要用 NIO 来读写文件,肯定是要用到 Channel 和 Buffer 了。一句话描述过程就是从 FileInputStream 得到的 FileChannel 中读取数据到 Buffer 中,再处理 Buffer 中的数据。看代码: 阅读全文 >>

Java NIO 入门学习(通道和缓冲区)

对于 NIO 来说,Channel(通道) 和 Buffer(缓冲区) 这两个东西是不得不提的,因为它们是 NIO 的核心对象,几乎每一个 I/O 操作都要它们。

通道是对原 I/O 流的模拟,但有不同的是它是双向的,不再像流那样分 InputStream 和 OutputStream,通道的双向性更好的反映了底层操作系统的真识情况。也不能像原 I/O 那样可以直接往流里写或读数据,在通道了传输数据必须经由缓冲区。有点类似原 I/O 流通过过滤器流 BufferedInputStream 和 BufferedOutputStream 来读写数据。

FileInputStream/FileOutputStream/RandomAccessFile/DatagramSocket/ServerSocket/Socket 的 getChannel() 方法可以获得相应类型的 Channel,Channel 的类型有 FileChannel/SocketChannel/SelectableChannel/DatagramChannel/ServerSocketChannel 等。 阅读全文 >>

Java NIO 入门学习(过门)

Java NIO(New IO) 还是在 JDK 1.4 中引入的新特性。JDK 1.4 的另一重要特性正则表达式大家应该经常用到,但 NIO 就可能使用寥寥了,大概是缘于旧有 IO 体系仍然够用。有如 JDK1.5 早就泛型和注解了,但基于各种原因而无法亲力去实践泛型和注解一般,NIO 多数时候也只是与我们擦着肩而已。

相比与 Old IO,NIO 在某些领域里确有其过人之处,所以现在让我们一起来对 NIO 有个更楚的认识。

NIO 的相关 API,在 java.nio 中,它会与你纠缠的就是各种 ChannelBuffer。相关的应用在于处理通道和缓冲区、异步(非阻塞)的 IO、文件的锁定、字符集的处理上。 阅读全文 >>