자바 에서 큰 파일 읽 기

6223 단어 자바 파일
원본 주소:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/
자바 커 다란 텍스트 파일 을 읽 으 면 메모리 가 넘 치지 않 고 성능 도 보장 합 니 다. 

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 = "C:\\mq\\read\\from.xml";

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) + "  ");

}

public static void main2(String[] args) throws Exception {
  int bufSize = 1024;
  byte[] bs = new byte[bufSize];
  ByteBuffer byteBuf = ByteBuffer.allocate(1024);
  FileChannel channel = new RandomAccessFile(fff, "r").getChannel();
  while (channel.read(byteBuf) != -1) {
   int size = byteBuf.position();
   byteBuf.rewind();
   byteBuf.get(bs); //          ,          。
   System.out.print(new String(bs, 0, size));
   byteBuf.clear();
  }

}

public static void main(String[] args) throws Exception {
  BufferedReader br = new BufferedReader(new FileReader(fff));
  String line = null;
  while ((line = br.readLine()) != null) {
   System.out.println(line);
  }
}

public static void main(String[] args) throws Exception {
    int bufSize = 1024;
    byte[] bs = new byte[bufSize];
    ByteBuffer byteBuf = ByteBuffer.allocate(1024);
    FileChannel channel = new RandomAccessFile("d:\\filename","r").getChannel();
    while(channel.read(byteBuf) != -1) {
      int size = byteBuf.position();
      byteBuf.rewind();
      byteBuf.get(bs);
      //          ,          。
      System.out.print(new String(bs, 0, size));
      byteBuf.clear();
    }
  }

}

자바 대 용량 파일 읽 기, 메모리 넘 침?어떻게 몇 줄 로 읽 고 여러 번 읽 습 니까?
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class TestPrint {
	public static void main(String[] args) throws IOException {
		String path = "         ";
		RandomAccessFile br=new RandomAccessFile(path,"rw");//  rw   。       r
		String str = null, app = null;
		int i=0;
		while ((str = br.readLine()) != null) {
			i++;
			app=app+str;
			if(i>=100){//    100 
				i=0;
//				      100   ,     
app=null;
			}
		}
		br.close();
	}

}

2G 이상 의 텍스트 파일 을 한 줄 씩 읽 을 때 다음 코드 를 사용 하 는 것 을 추천 합 니 다.

void largeFileIO(String inputFile, String outputFile) {
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(inputFile)));
            BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), 10 * 1024 * 1024);//10M  
            FileWriter fw = new FileWriter(outputFile);
            while (in.ready()) {
                String line = in.readLine();
                fw.append(line + " ");
            }
            in.close();
            fw.flush();
            fw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

jdk 자체 가 큰 파일 의 읽 기와 쓰 기 를 지원 합 니 다.
인터넷 의 글 은 기본적으로 두 가지 로 나 뉘 는데 하 나 는 Buffered Reader 류 를 사용 하여 초대형 파일 을 읽 고 쓰 는 것 이다.다른 하 나 는 RandomAccessFile 류 를 사용 하여 읽 는 것 입 니 다. 비 교 를 통 해 마지막 으로 큰 파일 을 읽 었 습 니 다. 다음은 관련 코드 입 니 다. 사실은 간단 합 니 다.

File file = new File(filepath);   
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));    
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);//  5M           
  
String line = "";
while((line = reader.readLine()) != null){
//TODO: write your business
}

좋은 웹페이지 즐겨찾기