Java读取大文件


java读取大文件代码,备忘。

import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileReader;  
import java.io.RandomAccessFile;  
import java.nio.ByteBuffer;  
import java.nio.MappedByteBuffer;  
import java.nio.channels.FileChannel;  
  
public class ReadBig {  
  
    public static String fff = "D:\\report\\inbound\\Citi_OrderLines.csv";  
  
    public static void main1(String[] args) throws Exception {  
  
        final int BUFFER_SIZE = 0x300000;// 缓冲区大小为3M  
  
        File f = new File(fff);  
  
        /** 
         * map(FileChannel.MapMode mode,long position, long size) mode - 
         * 根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 FileChannel.MapMode 类中所定义的 
         * READ_ONLY、READ_WRITE 或 PRIVATE 之一 position - 文件中的位置,映射区域从此位置开始;必须为非负数 
         * size - 要映射的区域大小;必须为非负数且不大于 Integer.MAX_VALUE 
         * 所以若想读取文件后半部分内容,如例子所写;若想读取文本后1 
         * /8内容,需要这样写map(FileChannel.MapMode.READ_ONLY, 
         * f.length()*7/8,f.length()/8) 
         * 想读取文件所有内容,需要这样写map(FileChannel.MapMode.READ_ONLY, 0,f.length()) 
         */  
  
        MappedByteBuffer inputBuffer = new RandomAccessFile(f, "r").getChannel().map(FileChannel.MapMode.READ_ONLY,  
                f.length() / 2, f.length() / 2);  
  
        byte[] dst = new byte[BUFFER_SIZE];// 每次读出3M的内容  
  
        long start = System.currentTimeMillis();  
  
        for (int offset = 0; offset < inputBuffer.capacity(); offset += BUFFER_SIZE) {  
  
            if (inputBuffer.capacity() - offset >= BUFFER_SIZE) {  
  
                for (int i = 0; i < BUFFER_SIZE; i++)  
  
                    dst[i] = inputBuffer.get(offset + i);  
  
            } else {  
  
                for (int i = 0; i < inputBuffer.capacity() - offset; i++)  
  
                    dst[i] = inputBuffer.get(offset + i);  
  
            }  
  
            int length = (inputBuffer.capacity() % BUFFER_SIZE == 0) ? BUFFER_SIZE : inputBuffer.capacity()  
                    % BUFFER_SIZE;  
  
            System.out.println(new String(dst, 0, length));// new  
            // String(dst,0,length)这样可以取出缓存保存的字符串,可以对其进行操作  
  
        }  
  
        long end = System.currentTimeMillis();  
  
        System.out.println("读取文件文件一半内容花费:" + (end - start) + "毫秒");  
  
    }  
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM