자바 빅 데이터 읽 기와 쓰기 문제 해결
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);
// 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.