我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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中如何用内存映射处理大文件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

Python使用mmap如何实现内存映射文件操作

这篇文章给大家分享的是有关Python使用mmap如何实现内存映射文件操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明 1)什么叫映射?   ==>就是给一个对象(可以是变量、物理等),起一个唯一的别名,建
2023-06-15

如何在 Golang 中使用内存映射提高文件读写速度?

使用 syscall.mmap 可在 go 中实施内存映射,将文件直接映射到内存以提高读写速度。该函数返回一个字节切片,代表映射区域,允许读写访问,并与文件共享修改。使用 syscall.munmap 取消映射,可提高读写性能,如实战案例所
如何在 Golang 中使用内存映射提高文件读写速度?
2024-05-16

如何使用VBA中的CopyMemory存储数据并从内存映射文件中获取数据

要使用VBA中的CopyMemory存储数据并从内存映射文件中获取数据,您可以按照以下步骤进行操作:1. 首先,您需要在VBA代码中声明CopyMemory函数。您可以使用以下代码将其添加到代码模块中:```vbaPublic Declar
2023-09-27

PHP开发中如何处理文件缓存和内存管理

在PHP开发中,文件缓存和内存管理是非常重要的方面。合理处理文件缓存可以提高系统的性能和响应速度,而良好的内存管理可以有效地减少内存泄漏和提升系统的稳定性。本文将详细介绍如何在PHP开发中处理文件缓存和内存管理,并提供具体的代码示例。文件缓
2023-10-21

如何处理PHP开发中的文件缓存和内存管理

在PHP开发中,文件缓存和内存管理是两个非常重要的方面。良好的文件缓存和内存管理可以显著提升应用的性能和可靠性。本文将介绍如何在PHP中进行文件缓存和内存管理,并给出具体的代码示例。一、文件缓存文件缓存是将已经生成的内容保存在文件中,下次访
2023-10-21

如何用vps处理大文件

使用VPS处理大文件的一种常见方法是通过SSH连接到VPS,并使用命令行工具来操作文件。以下是一些可以帮助你处理大文件的常用命令:1. scp:使用scp命令从本地计算机将大文件上传到VPS,或从VPS下载到本地计算机。示例:`scp /p
2023-09-08

java读取大文件如何防止内存泄漏

读取大文件时,可以使用以下方法来防止内存泄漏:使用缓冲流:通过缓冲流(如BufferedReader)来读取文件,可以减少内存占用,提高读取效率。分块读取:避免一次性将整个文件加载到内存中,可以分块读取文件内容,处理完一个块后再读取下一个块
java读取大文件如何防止内存泄漏
2024-04-08

java读取大文件内存溢出如何解决

在Java中,如果读取大文件时遇到内存溢出的问题,可以尝试以下几种解决方案:1. 使用缓冲区:使用BufferedReader或者BufferedInputStream来读取文件,并设置一个适当大小的缓冲区。这样可以减少每次读取的次数,从而
2023-08-25

利用java读取超大文件时出现内存溢出如何解决

利用java读取超大文件时出现内存溢出如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. 传统方式:在内存中读取文件内容读取文件行的标准方式是在内存中读
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录