文档章节

java NIO学习

masterxsun
 masterxsun
发布于 2016/01/26 21:25
字数 614
阅读 11
收藏 0

接口与抽象类的区别与联系:接口和抽象类的区别,基于此,补充一点,接口和抽象类均不可被实例化

java IO与java NIO的区别:Java NIO和IO的区别

1、java NIO涉及两个类,Buffer和Channel, Buffer为一个抽象类,Channel为一个接口。继承Buffer的子类有除boolean类型之外的所有类型的Buffer:

  • ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer。

Buffer中三个重要的值,capacity表示Buffer的容量,limit表示读取或写入时的边界位置,写入状态下limit = capacity,读取状态下表示Buffer中含有元素的容量,position表示当前位置,写入状态下表示下一个未被写入的位置,读取状态下表示起始位置。用flip()方法转换读写状态。其实现类含有put和get系列方法为向Buffer中读写操作的方法。

在文件操作中,实现Channel的类主要涉及抽象类FileChannel,获得FileChannel的方法为

  • FileInputStream.getChannel(),  FileOutputStream.getChannel(),  RandomAccessFile.getChannel()

与文件打交道的是Channel相关的类,起到连接Buffer与文件的作用。read(ByteBuffer[] param)方法和write(ByteBuffer[] param) 起到向缓冲区读数据和写入通道的功能。

以下代码实现了文件复制功能

...
FileChannel inputChannel = new FileInputStream("D:\\test.txt").getChannel();
FileChannel outputChannel = new FileOutputStream("D:\\test2.txt").getChannel();
ByteBuffer buf = ByteBuffer.allocate(64);
while(inputChannel.read(buf)!=-1){//read返回读入buf的长度,可能为0. 如果读到文件尾,返回-1;
    buf.flip();
    outputChannel.write(buf);
    buf.clear();
}
...

2、Channel的实现类有一个map函数,将,FileInputStream和FileOutputStream映射到Buf中去。

public abstract MappedByteBuffer map(FileChannel.MapMode mode,
                   long position,
                   long size)
                              throws IOException

  • Parameters:

  • mode - One of the constants READ_ONLY, READ_WRITE, or PRIVATE defined in the FileChannel.MapMode class, according to         whether the file is to be mapped read-only, read/write, or         privately (copy-on-write), respectively

  • position - The position within the file at which the mapped region         is to start; must be non-negative

  • size - The size of the region to be mapped; must be non-negative and         no greater than Integer.MAX_VALUE

  • Returns:

  • The mapped byte buffer

以下是用其map方法实现的文件复制功能:

...
File file = new File("D:\\test.txt").;
FileChannel inputChannel = new FileInputStream(file).getChannel();
FileChannel outputChannel = new FileOutputStream("D:\\test2.txt").getChannel();
ByteBuffer buf = inputChannel.map(MapMode.Read_ONLY,0,file.length())
outputChannel.write(buf);
buf.clear();
...

3、java7发布了nio.2提供了Files、Paths等final Class,提供了一系列简便的文件操作方法。用nio.2的方法实现文件复制非常简单。

public static long copy(Path source,
        OutputStream out)
                 throws IOException

  • Parameters:

  • source - the  path to the file

  • out - the output stream to write to

  • Returns:

  • the number of bytes read or written

...
Files.copy(Paths.get("D:"+File.separator+"test1.txt"),new FileOutputStream("D:"+File.separator+"test2.txt"));
...









© 著作权归作者所有

共有 人打赏支持
masterxsun
粉丝 0
博文 8
码字总数 2918
作品 0
长宁
私信 提问
Java NIO系列教程(十六) Java NIO Files

原文地址 译者:章筱虎 java NIO Files类(java.nio.file.Files) 提供了操作文件的相关方法。本篇文章将会覆盖大多数常用的方法。Files类包含了很多方法,如果你需要的功能在文中没有提及,需...

章 筱虎
2018/01/23
0
0
JAVA NIO编程入门(一)

JAVA NIO编程入门(一) 一、前言 笔者之前接触的NIO编程比较少,所以对这一块的基础也比较弱,NIO作为java编程中一个重要的模块,不能很好的掌握它,感觉自己在java方面就掌握的不够,所以,...

木木匠
2018/09/01
0
0
Java NIO AsynchronousFileChannel

原文链接 , 原文作者:Jakob Jenkov, 翻译:Neil Hao 在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。 创建一个A...

Neil_Hao
2018/01/20
0
0
Java网络编程框架

自从JDK1.4中有了NIO以后,这个方面越来越活跃,也为java赢得更多开发者的支持。做java网络编程需要掌握一些基本的知识和技能: 套接字编程、阻塞/非阻塞通信、创建HTTP服务器与客户程序、数...

长平狐
2012/08/29
2.3K
0
Java NIO ByteBuffer学习

深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别 http://chinaestone.iteye.com/blog/468138 DirectBuffer及内存泄漏 http://blog.csdn.net/zhouhl_cn/article/d......

mj4738
2012/10/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux下端口转发工具rinetd介绍

linux下简单好用的工具rinetd,实现端口映射/转发/重定向,针对TCP协议,不支持UDP。 官网地址 http://www.boutell.com/rinetd 里面介绍及使用齐全。 使用场景举例: 阿里云内网Redis连接问题...

ouhoo
8分钟前
0
0
Oracle学习日志-5(算数运算符,比较运算符和逻辑运算符)

因为有编程基础,所以对于这一章还是很好理解,只需要注意对NULL的运算。 操作的表格 算数运算符 查询商品名字和商品售价,并商品售价乘2 SELECT product_name,sale_price * 2 AS "sale_pri...

白话
21分钟前
0
0
搜索引擎(Lucene介绍、分词器详解)

Lucene介绍 Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简...

这很耳东先生
26分钟前
0
0
quartz详细介绍

quartz常用api Scheduler 调度程序交互的主要API。 Job 希望由调度程序执行的组件实现的接口。 JobDetail 用于定义作业的实例。 JobDataMap 可以包含不限量的序列化数据,在job运行的时候可以...

大笨象会跳舞吧
26分钟前
0
0
kotlin使用jackson序列化enum

默认情况下,我们序列化与反序列化enum是它的name,事实上大部分情况下我们需要序列化的是我们自定义的value,那应该怎么做呢? 这种情况下我们就需要@JsonValue与@JsonCreator data class U...

weidedong
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部