网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

Java中如何用内存映射处理大文件

本篇内容介绍了“Java中如何用内存映射处理大文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。成都创新互联坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供网站设计制作、成都网站制作、微信公众号开发、电商网站开发,成都微信小程序,软件按需开发网站等一站式互联网企业服务。

package test;   import java.io.BufferedInputStream;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java.io.IOException;  import java.io.RandomAccessFile;  import java.nio.MappedByteBuffer;  import java.nio.channels.FileChannel;   public class Test {             public static void main(String[] args) {          try {              FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");              int sum=0;              int n;              long t1=System.currentTimeMillis();              try {                  while((n=fis.read())>=0){                      sum+=n;                  }              } catch (IOException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }              long t=System.currentTimeMillis()-t1;              System.out.println("sum:"+sum+"  time:"+t);          } catch (FileNotFoundException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }                    try {              FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");              BufferedInputStream bis=new BufferedInputStream(fis);              int sum=0;              int n;              long t1=System.currentTimeMillis();              try {                  while((n=bis.read())>=0){                      sum+=n;                  }              } catch (IOException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }              long t=System.currentTimeMillis()-t1;              System.out.println("sum:"+sum+"  time:"+t);          } catch (FileNotFoundException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }                    MappedByteBuffer buffer=null;          try {              buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);              int sum=0;              int n;              long t1=System.currentTimeMillis();              for(int i=0;i<1253244;i++){                  n=0x000000ff&buffer.get(i);                  sum+=n;              }              long t=System.currentTimeMillis()-t1;              System.out.println("sum:"+sum+"  time:"+t);          } catch (FileNotFoundException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }       }   }

测试文件为一个大小为1253244字节的文件。测试结果:

sum:220152087 time:1464  sum:220152087 time:72  sum:220152087 time:25

说明读数据无误。删去其中的数据处理部分。

package test;   import java.io.BufferedInputStream;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java.io.IOException;  import java.io.RandomAccessFile;  import java.nio.MappedByteBuffer;  import java.nio.channels.FileChannel;   public class Test {             public static void main(String[] args) {          try {              FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");              int sum=0;              int n;              long t1=System.currentTimeMillis();              try {                  while((n=fis.read())>=0){                      //sum+=n;                  }              } catch (IOException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }              long t=System.currentTimeMillis()-t1;              System.out.println("sum:"+sum+"  time:"+t);          } catch (FileNotFoundException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }                    try {              FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");              BufferedInputStream bis=new BufferedInputStream(fis);              int sum=0;              int n;              long t1=System.currentTimeMillis();              try {                  while((n=bis.read())>=0){                      //sum+=n;                  }              } catch (IOException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }              long t=System.currentTimeMillis()-t1;              System.out.println("sum:"+sum+"  time:"+t);          } catch (FileNotFoundException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }                    MappedByteBuffer buffer=null;          try {              buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);              int sum=0;              int n;              long t1=System.currentTimeMillis();              for(int i=0;i<1253244;i++){                  //n=0x000000ff&buffer.get(i);                  //sum+=n;              }              long t=System.currentTimeMillis()-t1;              System.out.println("sum:"+sum+"  time:"+t);          } catch (FileNotFoundException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }       }   }

测试结果:

sum:0 time:1458  sum:0 time:67  sum:0 time:8

由此可见,将文件部分或者全部映射到内存后进行读写,速度将提高很多。

“Java中如何用内存映射处理大文件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


文章题目:Java中如何用内存映射处理大文件
本文网址:http://bjjierui.cn/article/jhgpci.html

其他资讯