比如说又一个868M的文本类型的文件 这个文件虽然很大,但是迫不得已必须要仔细查看,而且经常打开翻看,现在要用java写一个程序来读取。
有如下要求(越往上越优先,不一定全部符合要求,希望尽力而为):1.节省内存(或者说适合低配置的电脑,现在一个程序花100M内存我都觉得很大了)。
2.适合读大文件。
3.效率尽量高。
java读取文件的各种类我都试过 ,感觉效果都不太好,正在考虑要不要自己写一个类,无奈技术太差了。谁写得最好分数就给谁(我会保证80%的分归他的)。
有如下要求(越往上越优先,不一定全部符合要求,希望尽力而为):1.节省内存(或者说适合低配置的电脑,现在一个程序花100M内存我都觉得很大了)。
2.适合读大文件。
3.效率尽量高。
java读取文件的各种类我都试过 ,感觉效果都不太好,正在考虑要不要自己写一个类,无奈技术太差了。谁写得最好分数就给谁(我会保证80%的分归他的)。
It is very fast (a few seconds to examine a 1GB file) and it never blocks.
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.*;
import java.nio.channels.FileChannel;
import java.util.*;
import java.util.Map.Entry;public class LogTest
{
public static String path = "E:\\test.log";
public static void main(String[] args) throws Exception
{
final int BUFFER_SIZE = 0x1200000; //缓冲大小12M
File f = new File(path);
int temp = 0;
for(int z = 10 ;z > 0 ; z --)
{
MappedByteBuffer inputbuffer = new RandomAccessFile(f,"r").getChannel().map(FileChannel.MapMode.READ_ONLY ,f.length()*(z-1)/10 ,f.length()/10 );
for( int offset = 0 ; offset < inputbuffer.capacity() ; offset += BUFFER_SIZE )
{
byte[] bs = new byte[BUFFER_SIZE];
if(inputbuffer.capacity() - offset >= BUFFER_SIZE)
{
for(int i = 0; i < BUFFER_SIZE; i ++)
{
bs[i] = inputbuffer.get(offset + i);
}
}
else
{
for( int i = 0; i < inputbuffer.capacity() - offset ; i ++)
{
bs[i] = inputbuffer.get(offset + i);
}
}
int length = (inputbuffer.capacity() % BUFFER_SIZE == 0) ? BUFFER_SIZE
: inputbuffer.capacity() % BUFFER_SIZE;
temp +=new String(bs,0,length).length();
}
}
}
}