Java如何使用生物和NIO进行文件操作对比

  介绍

小编这次要给大家分享的是Java如何使用生物和NIO进行文件操作对比,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

<强>什么是Java NIO

同步非阻塞io模式,拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
Java NIO有三大组成部分:缓冲区,频道选择器,通过事件驱动模式实现了什么时候有数据可读的问题。

<强>什么是Java BIO& # 63;

同步阻塞io模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,生物的工作模式就是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。不知道io操作中什么时候有数据可读,所以一直是阻塞的模式。

<强> 1,读文件

包com.zhi.test;
  
  进口java.io.FileInputStream;
  进口java.io.FileReader;
  进口java.io.IOException;
  进口java.nio.ByteBuffer;
  进口java.nio.CharBuffer;
  进口java.nio.channels.FileChannel;
  进口charset;
  进口charsetdecoder;
  进口java.nio.file.Files;
  进口java.nio.file.Paths;/* *
  *文件读取,缓冲区大小(BF_SIZE)对NIO的性能影响特别大,对生物无影响& lt; br>
  * 10米的文件、生物耗时87毫秒,NIO耗时68毫秒,Files.read耗时62毫秒
  *
  * @author张远志
  * @since 2020年5月9日19:20:49
  *
  */公开课FileRead {/* *
  *缓冲区大小
  */私有静态最终int BF_SIZE=1024;/* *
  *使用生物读取文件
  *
  * @param文件名待读文件名
  * @return
  * @throws IOException
  */bioRead公共静态字符串(字符串文件名)抛出IOException {
  长时间的开始时间=System.currentTimeMillis ();
  尝试{
  FileReader读者=new FileReader(文件名);
  
  StringBuffer buf=new StringBuffer ();
  char [] cbuf=new char [BF_SIZE];
  而(reader.read (cbuf) !=1) {
  buf.append (cbuf);
  }
  reader.close ();
  返回buf.toString ();
  最后}{
  System.out.println(“使用生物读取文件耗时:“+ (System.currentTimeMillis()——开始时间)+“毫秒“);
  }
  }/* *
  *使用NIO读取文件
  *
  * @param文件名待读文件名
  * @return
  * @throws IOException
  */nioRead1公共静态字符串(字符串文件名)抛出IOException {
  长时间的开始时间=System.currentTimeMillis ();
  尝试{
  FileInputStream输入=new FileInputStream(文件名);
  FileChannel频道=input.getChannel ();
  
  CharsetDecoder解码器=Charset.defaultCharset () .newDecoder ();
  StringBuffer buf=new StringBuffer ();
  CharBuffer cBuf=CharBuffer.allocate (BF_SIZE);
  ByteBuffer bBuf=ByteBuffer.allocate (BF_SIZE);
  而(channel.read (bBuf) !=1) {
  bBuf.flip ();
  decoder.decode (bBuf cBuf,假);//解码字节转char,最后一个参数非常关键
  bBuf.clear ();
  buf.append (cBuf.array () 0 cBuf.position ());
  cBuf.compact ();//压缩
  }
  input.close ();
  返回buf.toString ();
  最后}{
  System.out.println(“使用NIO读取文件耗时:“+ (System.currentTimeMillis()——开始时间)+“毫秒“);
  }
  }/* *
  *使用Files.read读取文件
  *
  * @param文件名待读文件名
  * @return
  * @throws IOException
  */nioRead2公共静态字符串(字符串文件名)抛出IOException {
  长时间的开始时间=System.currentTimeMillis ();
  尝试{
  byte[]时代=Files.readAllBytes (Paths.get(文件名));
  返回新字符串(时代);
  最后}{
  System.out.println(“使用Files.read读取文件耗时:“+ (System.currentTimeMillis()——开始时间)+“毫秒“);
  }
  }
  
  公共静态void main (String [] args)抛出IOException {
  字符串文件名=癊:/source.txt";
  FileRead.bioRead(文件名);
  FileRead.nioRead1(文件名);
  FileRead.nioRead2(文件名);
  }
  }

<强> 2,写文件

包com.zhi.test;
  
  进口java.io.File;
  进口java.io.FileOutputStream;
  进口java.io.FileWriter;
  进口java.io.IOException;
  进口java.nio.ByteBuffer;
  进口java.nio.channels.FileChannel;
  进口java.nio.file.Files;
  进口java.nio.file.StandardOpenOption;/* *
  *文件写& lt; br>
  * 10米的数据,生物耗时毫45秒,NIO耗时毫42秒,Files.write耗时毫24秒
  *
  * @author张远志
  * @since 2020年5月9日21:04:40
  *
  */公开课FileWrite {/* *
  *使用生物进行文件写
  *
  * @param文件名文件名称
  * @param内容待写内存
  * @throws IOException
  */公共静态孔隙bioWrite(文件名字符串,字符串内容)抛出IOException {
  长时间的开始时间=System.currentTimeMillis ();
  尝试{
  FileWriter作家=new FileWriter(文件名);
  writer.write(内容);
  writer.close ();
  最后}{
  System.out.println(“使用生物写文件耗时:“+ (System.currentTimeMillis()——开始时间)+“毫秒“);
  }
  }/* *
  *使用NIO进行文件写
  *
  * @param文件名文件名称
  * @param内容待写内存
  * @throws IOException
  */公共静态孔隙nioWrite1(文件名字符串,字符串内容)抛出IOException {
  长时间的开始时间=System.currentTimeMillis ();
  尝试{
  FileOutputStream=新FileOutputStream(文件名);
  FileChannel频道=out.getChannel ();
  ByteBuffer buf=ByteBuffer.wrap (content.getBytes ());
  channel.write (buf);
  out.close ();
  最后}{
  System.out.println(“使用NIO写文件耗时:“+ (System.currentTimeMillis()——开始时间)+“毫秒“);
  }
  }/* *
  *使用Files.write进行文件写
  *
  * @param文件名文件名称
  * @param内容待写内存
  * @throws IOException
  */公共静态孔隙nioWrite2(文件名字符串,字符串内容)抛出IOException {
  长时间的开始时间=System.currentTimeMillis ();
  尝试{
  文件文件=新文件(文件名);
  如果(! file.exists ()) {
  file.createNewFile ();
  }
  content.getBytes Files.write (file.toPath () (), StandardOpenOption.WRITE);
  最后}{
  System.out.println(“使用Files.write写文件耗时:“+ (System.currentTimeMillis()——开始时间)+“毫秒“);
  }
  }
  
  公共静态void main (String [] args)抛出IOException {
  字符串内容=FileRead.nioRead2 (“E:/source.txt");
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

Java如何使用生物和NIO进行文件操作对比