當前位置:編程學習大全網 - 源碼下載 - 當java讀取壹個巨大的文本文件時,如何實現既保證內存溢出又保證性能?

當java讀取壹個巨大的文本文件時,如何實現既保證內存溢出又保證性能?

導入Java . io . buffered reader;

導入Java . io . file;

導入Java . io . filereader;

導入Java . io . random access file;

導入Java . nio . byte buffer;

導入Java . nio . mappedbytebuffer;

導入Java . nio . channels . file channel;

公共類ReadBig {

公共靜態字符串fff = " C:\ \ MQ \ \ read \ \ from . XML ";

公共靜態void main1(String[] args)引發異常{

final int BUFFER _ SIZE = 0x300000//緩沖區大小為3M。

文件f =新文件(fff);

/**

*

*映射(文件通道。MapMode模式,長位置,長尺寸)

*

*模式-根據文件通道中定義的只讀、讀/寫或專用(寫入時復制)來映射文件。MapMode類。

*只讀、讀寫或私有中的壹種。

*

* position-文件中映射區域開始的位置;必須為非負數

*

* size-要映射的區域的大小;必須為非負且不大於整數。MAX_VALUE。

*

*所以如果妳想讀文件的後半部分,就像例子中寫的那樣;如果要讀取正文後1/8的內容,需要寫map(文件通道。mapmode.read _ only

*全長()*7/8,全長()/8)

*

*要讀取壹個文件的所有內容,需要編寫map(文件通道。mapmode.read _ only,0,f.length())這樣。

*

*/

MappedByteBuffer input buffer = new random access file(f," r ")

。getChannel()。映射(文件通道。MapMode .只讀,

f.length() / 2,f . length()/2);

byte[] dst =新字節[BUFFER _ SIZE];//壹次讀取3M的內容。

long start = system . current time millis();

for(int offset = 0;offset & ltinput buffer . capacity();offset += BUFFER_SIZE) {

if(input buffer . capacity()-offset & gt;=緩沖區大小){

for(int I = 0;我& ltBUFFER _ SIZEi++)

dst[I]= input buffer . get(offset+I);

}否則{

for(int I = 0;我& ltinputBuffer.capacity() -偏移量;i++)

dst[I]= input buffer . get(offset+I);

}

int length =(input BUFFER . capacity()% BUFFER _ SIZE = = 0)?緩沖區大小

:input BUFFER . capacity()% BUFFER _ SIZE;

system . out . println(new String(dst,0,length));//新建

// String(dst,0,length)以便取出緩存中保存的字符串進行操作。

}

long end = system . current time millis();

System.out.println("讀取壹個文件的壹半內容需要"+(end-start)+" ms ");

}

公共靜態void main2(String[] args)引發異常{

int bufSize = 1024;

byte[] bs =新字節[bufSize];

byte buffer byte buf = byte buffer . allocate(1024);

file channel channel = new random access file(fff," r ")。get channel();

while (channel.read(byteBuf)!= -1) {

int size = byte buf . position();

byte buf . rewind();

byte buf . get(bs);//以文件為字符串,直接打印為例。

System.out.print(新字符串(bs,0,size));

byte buf . clear();

}

}

公共靜態void main(String[] args)引發異常{

buffered reader br = new buffered reader(新文件閱讀器(fff));

String line = null

while ((line = br.readLine())!= null) {

system . out . println(line);

}

}

}

  • 上一篇:迪士尼卡通工作室電影列表
  • 下一篇:txt全集。
  • copyright 2024編程學習大全網