Java NIO 简单了解
一直没有了解过NIO,更没有用过NIO,由于很多分布式框架或多或少都涉及到了NIO,因此,先做个简单了解。
NIO入门
推荐:NIO 入门,入门教程中没有比这篇更合适的了。
NIO文件读取和写入
一个简单的文件复制例子。
首先创建两个输入输出流:
FileInputStream fin = new FileInputStream("D:/test.txt");
FileOutputStream fout = new FileOutputStream("D:/copy.txt");
然后从输入输出流获取文件通道:
FileChannel fcin = fin.getChannel();
FileChannel fcout = fout.getChannel();
下面通过byte[]
数组包装的ByteBuffer
,这里是由数组包装的目的是为了下面的输出文件的内容。
byte[] bytes = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap(bytes);
如果仅仅是读取流,可以直接使用ByteBuffer buffer = ByteBuffer.allocate(1024)
这种方式创建ByteBuffer
。
然后通过一个循环来读取数据:
do {
在使用buffer
前后先clear()
,主要功能就是把标志位置为初始状态。
buffer.clear();
int r = fcin.read(buffer);
当读完的时候,终止循环:
if (r == -1) {
break;
}
如果想要输出读取的内容,可以参考下面的方法,用ByteArrayOutputStream
会更方便:
System.out.print(new String(bytes, 0, r, "UTF-8"));
在写入之前,需要先调用buffer
的flip()
方法,该方法也是通过修改标志位,可以根据实际的长度写入输出流中:
buffer.flip();
写入输出流:
fcout.write(buffer);
} while (true);
最后别忘了关闭流,这里需要注意一点,channel
对象也有一个close()
方法,该方法实际上是调用InputStream
和OutputStream
的close()
方法,所以这里最好的关闭方式,就是在Stream
上调用close()
。
fin.close();
fout.close();
关于更多的细节,建议阅读:NIO 入门