Java使用BIO和NIO进行文件操作对比代码示例
什么是JavaNIO?
同步非阻塞io模式,拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
JavaNIO有三大组成部分:Buffer,Channel,Selector,通过事件驱动模式实现了什么时候有数据可读的问题。
什么是JavaBIO?
同步阻塞IO模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。不知道io操作中什么时候有数据可读,所以一直是阻塞的模式。
1、读文件
packagecom.zhi.test; importjava.io.FileInputStream; importjava.io.FileReader; importjava.io.IOException; importjava.nio.ByteBuffer; importjava.nio.CharBuffer; importjava.nio.channels.FileChannel; importjava.nio.charset.Charset; importjava.nio.charset.CharsetDecoder; importjava.nio.file.Files; importjava.nio.file.Paths; /** *文件读取,缓冲区大小(BF_SIZE)对NIO的性能影响特别大,对BIO无影响
*10M的文件,BIO耗时87毫秒,NIO耗时68毫秒,Files.read耗时62毫秒 * *@author张远志 *@since2020年5月9日19:20:49 * */ publicclassFileRead{ /** *缓冲区大小 */ privatestaticfinalintBF_SIZE=1024; /** *使用BIO读取文件 * *@paramfileName待读文件名 *@return *@throwsIOException */ publicstaticStringbioRead(StringfileName)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ FileReaderreader=newFileReader(fileName); StringBufferbuf=newStringBuffer(); char[]cbuf=newchar[BF_SIZE]; while(reader.read(cbuf)!=-1){ buf.append(cbuf); } reader.close(); returnbuf.toString(); }finally{ System.out.println("使用BIO读取文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } /** *使用NIO读取文件 * *@paramfileName待读文件名 *@return *@throwsIOException */ publicstaticStringnioRead1(StringfileName)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ FileInputStreaminput=newFileInputStream(fileName); FileChannelchannel=input.getChannel(); CharsetDecoderdecoder=Charset.defaultCharset().newDecoder(); StringBufferbuf=newStringBuffer(); CharBuffercBuf=CharBuffer.allocate(BF_SIZE); ByteBufferbBuf=ByteBuffer.allocate(BF_SIZE); while(channel.read(bBuf)!=-1){ bBuf.flip(); decoder.decode(bBuf,cBuf,false);//解码,byte转char,最后一个参数非常关键 bBuf.clear(); buf.append(cBuf.array(),0,cBuf.position()); cBuf.compact();//压缩 } input.close(); returnbuf.toString(); }finally{ System.out.println("使用NIO读取文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } /** *使用Files.read读取文件 * *@paramfileName待读文件名 *@return *@throwsIOException */ publicstaticStringnioRead2(StringfileName)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ byte[]byt=Files.readAllBytes(Paths.get(fileName)); returnnewString(byt); }finally{ System.out.println("使用Files.read读取文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } publicstaticvoidmain(String[]args)throwsIOException{ StringfileName="E:/source.txt"; FileRead.bioRead(fileName); FileRead.nioRead1(fileName); FileRead.nioRead2(fileName); } }
2、写文件
packagecom.zhi.test; importjava.io.File; importjava.io.FileOutputStream; importjava.io.FileWriter; importjava.io.IOException; importjava.nio.ByteBuffer; importjava.nio.channels.FileChannel; importjava.nio.file.Files; importjava.nio.file.StandardOpenOption; /** *文件写
*10M的数据,BIO耗时45毫秒,NIO耗时42毫秒,Files.write耗时24毫秒 * *@author张远志 *@since2020年5月9日21:04:40 * */ publicclassFileWrite{ /** *使用BIO进行文件写 * *@paramfileName文件名称 *@paramcontent待写内存 *@throwsIOException */ publicstaticvoidbioWrite(StringfileName,Stringcontent)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ FileWriterwriter=newFileWriter(fileName); writer.write(content); writer.close(); }finally{ System.out.println("使用BIO写文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } /** *使用NIO进行文件写 * *@paramfileName文件名称 *@paramcontent待写内存 *@throwsIOException */ publicstaticvoidnioWrite1(StringfileName,Stringcontent)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ FileOutputStreamout=newFileOutputStream(fileName); FileChannelchannel=out.getChannel(); ByteBufferbuf=ByteBuffer.wrap(content.getBytes()); channel.write(buf); out.close(); }finally{ System.out.println("使用NIO写文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } /** *使用Files.write进行文件写 * *@paramfileName文件名称 *@paramcontent待写内存 *@throwsIOException */ publicstaticvoidnioWrite2(StringfileName,Stringcontent)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ Filefile=newFile(fileName); if(!file.exists()){ file.createNewFile(); } Files.write(file.toPath(),content.getBytes(),StandardOpenOption.WRITE); }finally{ System.out.println("使用Files.write写文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } publicstaticvoidmain(String[]args)throwsIOException{ Stringcontent=FileRead.nioRead2("E:/source.txt"); Stringtarget1="E:/target1.txt",target2="E:/target2.txt",target3="E:/target3.txt"; FileWrite.bioWrite(target1,content); FileWrite.nioWrite1(target2,content); FileWrite.nioWrite2(target3,content); } }
3、复制文件
packagecom.zhi.test; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.nio.channels.FileChannel; importjava.nio.file.Files; importjava.nio.file.Paths; /** *文件复制
*10M的文件,bio耗时56毫秒,nio耗时12毫秒,Files.copy耗时10毫秒 * *@author张远志 *@since2020年5月9日17:18:01 * */ publicclassFileCopy{ /** *使用BIO复制一个文件 * *@paramtarget源文件 *@paramsource目标文件 * *@throwsIOException */ publicstaticvoidbioCopy(Stringsource,Stringtarget)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ FileInputStreamfin=newFileInputStream(source); FileOutputStreamfout=newFileOutputStream(target); byte[]byt=newbyte[1024]; while(fin.read(byt)>-1){ fout.write(byt); } fin.close(); fout.close(); }finally{ System.out.println("使用BIO复制文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } /** *使用NIO复制一个文件 * *@paramtarget源文件 *@paramsource目标文件 * *@throwsIOException */ publicstaticvoidnioCopy1(Stringsource,Stringtarget)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ FileInputStreamfin=newFileInputStream(source); FileChannelinChannel=fin.getChannel(); FileOutputStreamfout=newFileOutputStream(target); FileChanneloutChannel=fout.getChannel(); inChannel.transferTo(0,inChannel.size(),outChannel); fin.close(); fout.close(); }finally{ System.out.println("使用NIO复制文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } /** *使用Files.copy复制一个文件 * *@paramtarget源文件 *@paramsource目标文件 * *@throwsIOException */ publicstaticvoidnioCopy2(Stringsource,Stringtarget)throwsIOException{ longstartTime=System.currentTimeMillis(); try{ Filefile=newFile(target); if(file.exists()){ file.delete(); } Files.copy(Paths.get(source),file.toPath()); }finally{ System.out.println("使用Files.copy复制文件耗时:"+(System.currentTimeMillis()-startTime)+"毫秒"); } } publicstaticvoidmain(String[]args)throwsIOException{ Stringsource="E:/source.txt"; Stringtarget1="E:/target1.txt",target2="E:/target2.txt",target3="E:/target3.txt"; FileCopy.bioCopy(source,target1); FileCopy.nioCopy1(source,target2); FileCopy.nioCopy2(source,target3); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
