永发信息网

利用java.nio的FileChannel能够实现按行读取文件吗?(解决了)

答案:2  悬赏:50  手机版
解决时间 2021-03-08 04:27
利用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();
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
cf汤姆逊烈龙与RPK盘龙哪个好 想买一把
陕西中医药大学文科中医学学的是什么?
我想学钢琴及调律。在什么地方学?
交强险赔本车人员吗?
苟于安诊所地址有知道的么?有点事想过去
are是什么意思?
中国明末清初的思想家唐甄:“言,我之言也。
女主穿越异世,姓风,是风族族长,有水族,火族,
茴香和鸡蛋木耳能包饺子吗?
什么牌子的金丝皇菊好?求推荐。
中国移动通讯G3手机专卖市教委店怎么去啊,有
【百分之一】百分之一是这样写1%,千分之一怎
鲫鱼生存的环境是怎样的?
汽车换电瓶怎么看需不需要搭电
科协这个单位是属于行政单位吗?它与科技局有
推荐资讯
为什么我下的暴力摩托2008除了摩托车外没有任
流动比率怎么算的
如何用手机强行断开已被其他手机配对的音响蓝
武魂新资料片什么时候出的呀?
主角复活曾经战死的修真者一起抵抗异族天使入
浙江到贵州三穗的高铁是到宁波上车还是到杭州
原油是什么时间开始的?
谁有移动手机营业厅的旧版本,求助
为什么我家网络显示无lnternet访问
众泰大迈X5的车买了38天、变速箱就出问题了、
北方地区多旱涝的原因是
日本小森双色印刷机冬季用多少号机油?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?