자바 빅 데이터 읽 기와 쓰기 문제 해결

자바 IO 가 큰 파일 을 읽 고 쓰 는 몇 가지 방식 과 테스트:http://aronlulu.iteye.com/blog/1018370
 
SRTM 의 데 이 터 를 읽 고 쓸 수 있 습 니 다.
 
JAVA 메모리 맵 파일:http://jiangzhengjun.iteye.com/blog/515745
 
메모리 맵 파일 은 너무 커서 메모리 에 넣 을 수 없 는 파일 을 만 들 고 수정 할 수 있 습 니 다.메모리 맵 파일 이 있 으 면 파일 이 메모리 에 모두 읽 혔 다 고 생각 하고 아주 큰 배열 로 접근 할 수 있 습 니 다.이런 해결 방법 은 파일 을 수정 하 는 코드 를 크게 간소화 할 수 있다.fileChannel. map (FileChannel. MapMode mode, long position, long size) 는 이 채널 의 파일 영역 을 메모리 에 직접 표시 합 니 다.파일 의 어느 위치 에서 부터 매 핑 되 었 는 지, 매 핑 의 범위 가 얼마나 되 는 지 알려 야 합 니 다.큰 파일 의 작은 세 션 을 비 추 는 것 이다.
MappedByteBuffer 는 ByteBuffer 의 하위 클래스 이기 때문에 ByteBuffer 의 모든 방법 을 갖 추고 있 지만, force () 를 추가 하여 버퍼 의 내용 을 저장 장치 에 강제로 새로 고침 하고, load () 는 저장 장치 의 데 이 터 를 메모리 에 불 러 오고, isLoaded () 위치 메모리 의 데이터 가 저장 설정 과 동기 화 되 는 지 여부 입 니 다.put () 와 get () 방법 만 간단하게 보 여 주 었 습 니 다. 그 밖 에 asCharBuffer () 와 같은 방법 으로 기본 데이터 의 버퍼 보 기 를 얻 은 후에 기본 형식 데 이 터 를 편리 하 게 읽 고 쓸 수 있 습 니 다.
자바 코드
 
收藏代码
  • import java.io.RandomAccessFile;   
  • import java.nio.MappedByteBuffer;   
  • import java.nio.channels.FileChannel;   
  •   
  • public class LargeMappedFiles {   
  •     static int length = 0x8000000; // 128 Mb   
  •   
  •     public static void main(String[] args) throws Exception {   
  •         // 읽 고 쓸 수 있 는 방식 으로 파일 을 열기 위해 서 는 RandomAccessFile 을 사용 하여 파일 을 만 듭 니 다.  
  •         FileChannel fc = new RandomAccessFile("test.dat", "rw").getChannel();   
  •         //파일 채널 의 읽 기 및 쓰기 가 파일 흐름 자체 의 읽 기 및 쓰기 기반 위 에 세 워 져 있 음 을 주의 하 십시오.  
  •         MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, length);   
  •         //128 M 쓰 는 거.  
  •         for (int i = 0; i < length; i++) {   
  •             out.put((byte) 'x');   
  •         }   
  •         System.out.println("Finished writing");   
  •         //파일 중간 6 바이트 내용 읽 기  
  •         for (int i = length / 2; i < length / 2 + 6; i++) {   
  •             System.out.print((char) out.get(i));   
  •         }   
  •         fc.close();   
  •     }   
  • }  
  • import java.io.RandomAccessFile;
    import java.nio.MappedByteBuffer;
    import java.nio.channels.FileChannel;
    
    public class LargeMappedFiles {
    	static int length = 0x8000000; // 128 Mb
    
    	public static void main(String[] args) throws Exception {
    		//               ,    RandomAccessFile     。
    		FileChannel fc = new RandomAccessFile("test.dat", "rw").getChannel();
    		//  ,                          
    		MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, length);
    		// 128M   
    		for (int i = 0; i < length; i++) {
    			out.put((byte) 'x');
    		}
    		System.out.println("Finished writing");
    		//      6     
    		for (int i = length / 2; i < length / 2 + 6; i++) {
    			System.out.print((char) out.get(i));
    		}
    		fc.close();
    	}
    }

     
    맵 작성 은 FileOutputStream 을 사용 해 야 할 것 같 지만 맵 파일 의 모든 출력 은 RandomAccessFile 을 사용 해 야 합 니 다. 그러나 읽 기만 하면 FileInputStream 을 사용 할 수 있 습 니 다. 맵 파일 을 쓸 때 는 무 작위 로 파일 에 접근 해 야 합 니 다. 쓸 때 읽 어야 하 는 이 유 를 알 수 있 습 니 다.
     
    이 프로그램 은 128 Mb 파일 을 만 들 었 습 니 다. 메모리 에 한 번 에 읽 으 면 메모리 가 넘 칠 수 있 습 니 다. 그러나 이 곳 에 접근 하 는 것 은 한 순간 인 것 같 습 니 다. 이 는 실제 메모리 에 들 어 온 것 은 그 중의 일부분 일 뿐 이 고 나머지 부분 은 교환 파일 에 놓 여 있 기 때 문 입 니 다. 그러면 초대형 파일 을 편리 하 게 수정 할 수 있 습 니 다 (최대 2GB 까지 가능).자바 는 운영 체제 의 '파일 맵 메커니즘' 을 호출 하여 성능 을 향상 시 킵 니 다.
     
     
    package cn.edu.xjtu.nhpcc.jenva.file;import   java.io.*;   import   java.nio.*;   import   java.nio.channels.*;
    public class LargeFileReader {
       static   int   length   =   0x8FFFFFF;   //   128   Mb     /**  * @param args  * @throws IOException   * @throws FileNotFoundException   */ public static void main(String[] args) throws FileNotFoundException, IOException {   /* The following works well.     MappedByteBuffer out =  new RandomAccessFile( "test.dat",   "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);        for(int   i   =   0;   i   <   length;   i++)        out.put((byte) 'x');        System.out.println( "Finished   writing ");        for(int   i   =   length/2;   i   <   length/2   +   6;   i++)                System.out.print((char)out.get(i));       //read   file       */    /* The following is ours. */  FileChannel fc = new RandomAccessFile( "srtm1","r").getChannel();  System.out.println(fc.size());  long maxValue = length;  if (maxValue>fc.size()) {   maxValue = fc.size();  }       MappedByteBuffer out =  fc.map(FileChannel.MapMode.READ_ONLY, 0, maxValue);             FileWriter fw = new FileWriter("srtm1-2");     int line =3601;               for(int   i   =   0;   i   <   maxValue;   i++) {      if (i != 0 &&i %(maxValue/line) == 0 ) {              fw.append("/n");       fw.append((char)out.get(i));      }else {       if (i 
     
     
    package cn.edu.xjtu.nhpcc.jenva.file;
    import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;
    public class FileReaderTest {
     /**  * @param args  * @throws IOException   */ public static void main(String[] args) throws IOException {  // TODO Auto-generated method stub
      /*  MyFileReader f = new MyFileReader();  f.reader("hi");  */    /*   * 아래 코드 는 읽 은 길 이 를 빈 칸 으로 계산 합 니 다.   */  /*  BufferedReader is = new BufferedReader(new FileReader("dbPoolParameter"));  ArrayList a = new ArrayList();      String s = is.readLine();   System.out.println(s.length());   */    /*   * 아래 의 이 코드 는 순수한 숫자 로 읽 혀 져 있 으 며 빈 칸 은 계산 되 지 않 습 니 다.   */   /*  BufferedReader is = new BufferedReader(new FileReader("srtm1"));  ArrayList a = new ArrayList();     String s = is.readLine();   s.trim();   String b[] = s.split(" ");   System.out.println(b.length);     for (int i=0; i a = new ArrayList();  int line = 2;  for (int i=0; i}
     
     

    좋은 웹페이지 즐겨찾기