千家信息网

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

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,本篇内容介绍了"Java中如何用内存映射处理大文件"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pa
千家信息网最后更新 2025年01月21日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中如何用内存映射处理大文件"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

文件 内存 处理 测试 内容 数据 更多 知识 结果 部分 实用 学有所成 接下来 困境 大小 字节 实际 情况 数据处理 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器怎么找到网页文件 农村网络安全工作责任制 方舟服务器招收管理 网络安全竞赛答辩 金融行业中的软件开发 明日之后进错服务器怎么换 维护校园网络安全班会主题 镇江软件开发哪家好 网络安全故事进课堂主题班会 云服务器删了怎么办 廊坊市网联网络技术有限公司 军事网络安全进步有哪些 乐播投屏大屏服务器异常 大数据分析属于软件开发吗 软件开发使用权拥有权 服务器可以开服吗 网络安全手抄报文字内容 短语 网络安全考研院校有哪些 天津网络安全博览会时间 微信号服务器 傲鹰网络技术 电脑服务器中程序重启怎么弄 医疗网络安全需要哪些培训 网络安全管理员面试有哪些问题 江门又确网络技术有限公司 指挥中心开展网络安全培训 圣诞节铃声软件开发 军事网络安全进步有哪些 上海可视化智慧小区软件开发 私人网络安全教育平台
0