자바 에서 큰 파일 읽 기
6223 단어 자바 파일
자바 커 다란 텍스트 파일 을 읽 으 면 메모리 가 넘 치지 않 고 성능 도 보장 합 니 다.
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
}