内存映射文件方式(MappedByteBuffer)处理文件的实例

本文介绍了一种使用Java内存映射文件技术处理大型文件的方法。通过实例演示了如何读取文件,并采用特定条件筛选文件内容,实现了高效的数据处理。整个过程仅用几秒钟便完成了对809MB文件及9万条数据的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package org.phoenix.cases.kafka;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import org.junit.Test;
/**
 * 内存映射文件方式处理文件的实例
 * @author mengfeiyang
 *
 */
public class MappedBytes {
 String filePath = "E:\\工作目录\\新项目\\凤舞一期\\backup\\new_show_style_json.txt";
 
 
 /**
  * 内存映射文件方式处理文件的实例
  * @throws FileNotFoundException
  * @throws IOException
  */
 @SuppressWarnings("resource")
 @Test
 public void testMappedByte() throws FileNotFoundException, IOException {
  long start = System.currentTimeMillis();
  File file = new File(filePath);
  long fileLength = file.length();
  final int BUFFER_SIZE=0x500000;//5M
  MappedByteBuffer inputBuffer = new RandomAccessFile(file,"rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, fileLength);
  byte[] dst = new byte[BUFFER_SIZE];
  int count=0;
  for(int offset=0;offset<fileLength;offset += BUFFER_SIZE){
            if (fileLength - offset >= BUFFER_SIZE) {    
                for (int i = 0; i < BUFFER_SIZE; i++)    
                    dst[i] = inputBuffer.get(offset + i);    
            } else {    
                for (int i = 0; i < fileLength - offset; i++)    
                    dst[i] = inputBuffer.get(offset + i);    
            }    
            String bs = new String(dst,"UTF-8");//将buffer中的字节转成字符串
            String[] ns = bs.split("\n");
            for(String s : ns){
             if(s.contains(" -1- ")){
              count++;
              System.out.println(s.split("- 1 -")[0]);
             }
            }
           
            System.out.println();
            //String s = IOUtils.toString(new ByteArrayInputStream(dst));
            //System.out.println(s);
  }
  System.out.println("总处理条数:"+count);
  long end = System.currentTimeMillis();
 
  System.out.println((end - start)/1000);//处理809M的文件,90000条数据,只用了6秒
 }
 
 }
}

 

转载于:https://my.oschina.net/u/2391658/blog/523524

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值