Java中使用readLine()出现字符(串)丢失的问题

探讨Java中使用BufferedReader的readLine()方法读取文件时,可能导致首行数据丢失的问题及其解决办法。

     在Java基础的过程中,我们会学习到文件IO这个知识点,而综合目前的状况来看,文件IO也是很多公司笔试、面试的一个比较喜欢提到的一个知识点,相应的,许多招聘岗位也明确要求应聘者必须具备能够熟练运用像文件IO这种基础知识的能力。今天,要说的是文件IO中的一个小知识点————br.readLine()读取文件,出现整行字符丢失

     下面是一个简单的例子,如不恰当,请多多指教!!!

   当使用br.readLine()来做条件时

        

package fileIO;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class FileDemo {
    public static void main(String[] args) throws IOException {
        File file=new File("F:"+File.separator+"XXX"+File.separator+"score.txt");
        InputStream in=null;
        BufferedReader br=null;
        try {
            in = new FileInputStream(file);
            br=new BufferedReader(new InputStreamReader(in, "gbk"));
            String str=null;
            //读取文件内容
            while(br.readLine()!=null) {  
              str=br.readLine();//这里写法看似没问题,实际上已经造成了结果第一行字符丢失的问题
              System.out.println(str);   
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(in!=null)in.close();
            if(br!=null)br.close();
        }
        
    }
}

     是什么原因造成了文本内容的第一行整行字符丢失的问题呢?其实就是这两句代码的问题

     

 //读取文件内容
while(br.readLine()!=null) {
         str=br.readLine();
         System.out.println(str);   
     }

     在while的判断条件中:    br.readLine()!=null 作为判断条件,已经进行了一次读取,所以此时br.readLine()所读取的内容就是文本文件中的第一行内容, 而紧接着循环体中,又将  str=br.readLine(),这里str的值是br.readLine()第二次执行的值,对应的也就是上次被读取行的下一行内容,当打印语句第一次输出时,输出的其实是br.readLine()第二次读取的文本内容,因此才会出现第一行整行丢失的情况。 

     将代码改成如下,就能解决该问题

//读取文件内容
while((str=br.readLine())!=null) {  //这样既是判断条件,也获取到了第一行的内容
           System.out.println(str);   //直接打印
         }

 这种问题其实并不多见,一般新手在没有仔细考虑代码逻辑的情况下可能会出现,此外br.read()等方法也会出现这种现象,原理都是一样的,写代码还是要多多细心,考虑周全!

参考文档:https://my.oschina.net/u/3624220/blog/1528602

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值