利用java.nio的FileChannel能够实现按行读取文件吗?(解决了)
展开全部
利用java.nio的FileChannel能够实现按行读取文件:
具体思路是:设置两个缓冲区,一大一小,大的缓冲区为每次读取的量,小的缓冲区存放每行的数据(确保大小可存放文本中最长的那行)。读取的时候判断是不是换行符13,是的话则返回一行数据,不是的话继续读取,直到读完文件。
实现方法:
FileChannel fc=raf.getChannel();
//一次读取文件,读取的字节缓存数
ByteBuffer fbb=ByteBuffer.allocate(1024*5);
fc.read(fbb);
fbb.flip();
//每行缓存的字节 根据你的实际需求
ByteBuffer bb=ByteBuffer.allocate(500);
//判断是否读完文件
public boolean hasNext() throws IOException {
if(EOF)return false;
if(fbb.position()==fbb.limit()){//判断当前位置是否到了缓冲区的限制
if(readByte()==0) return false;
}
while(true){
if(fbb.position()==fbb.limit()){
if(readByte()==0) break;
}
byte a=fbb.get();
if(a==13){
if(fbb.position()==fbb.limit()){
if(readByte()==0) break;
}
return true;
}else{
if (bb.position() < bb.limit()) {
bb.put(a);
}else {
if(readByte()==0) break;
}
}
}
return true;
}
展开全部
遇到一个需要逐行读取文件的地方。按照正常的写法是可以实现的。 File f = new File(fileName);
InputStreamReader read = new InputStreamReader (new FileInputStream(f),"EUC-JP"); BufferedReader br = new BufferedReader(read) ;
String sLine = br.readLine() ;
while (sLine!=null){
fileTemp = sLine.toString() ; ......... sLine = br.readLine() ; } 但是,人家要求用FileChannel写。我不知道为什么非要用通道写。为了多个线程可以并发的使用文件通道?还是他的文件比较大,这样写提高效率?但是这样写的结果是,将整个文件的区域直接映射到了内存中,这样就没有了行的概念,整个文件都被看成CharBuffer(或者Bytebuffer,IntBuffer...)了!我怎么才能区分出每一行的数据呢? 代码如下,请高手给分析一下 FileInputStream fis;
fis = new FileInputStream(fileName);
FileChannel channel = fis.getChannel(); int length = (int)channel.size(); MappedByteBuffer byteBuffer = channel.map (FileChannel.MapMode.READ_ONLY, 0, length); Charset charset = Charset.forName("EUC-JP"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(byteBuffer);
StringBuffer sb = new StringBuffer();
InputStreamReader read = new InputStreamReader (new FileInputStream(f),"EUC-JP"); BufferedReader br = new BufferedReader(read) ;
String sLine = br.readLine() ;
while (sLine!=null){
fileTemp = sLine.toString() ; ......... sLine = br.readLine() ; } 但是,人家要求用FileChannel写。我不知道为什么非要用通道写。为了多个线程可以并发的使用文件通道?还是他的文件比较大,这样写提高效率?但是这样写的结果是,将整个文件的区域直接映射到了内存中,这样就没有了行的概念,整个文件都被看成CharBuffer(或者Bytebuffer,IntBuffer...)了!我怎么才能区分出每一行的数据呢? 代码如下,请高手给分析一下 FileInputStream fis;
fis = new FileInputStream(fileName);
FileChannel channel = fis.getChannel(); int length = (int)channel.size(); MappedByteBuffer byteBuffer = channel.map (FileChannel.MapMode.READ_ONLY, 0, length); Charset charset = Charset.forName("EUC-JP"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(byteBuffer);
StringBuffer sb = new StringBuffer();
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询