java NIO学习
java NIO学习
masterxsun 发表于2年前
java NIO学习
  • 发表于 2年前
  • 阅读 11
  • 收藏 0
  • 点赞 1
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

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

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"));
...









  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 6
码字总数 2389
×
masterxsun
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: