InputStream in = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
long count = 0;
String line = br.readLine();
while (line != null) {
count += line.getBytes("UTF-8").length;
count += 1; // Add \r's length
System.out.println(Thread.currentThread() + "  " + line);
System.out.println(" count:" + count);
line = br.readLine();
}
求问为什么count计算的字节数和实际的字节数不一样

解决方案 »

  1.   

    br.readLine(); 
    会把
    \r
    或者
    \n
    或者
    \r\n
    作为换行符,所以不一定都是+1;当然你要是得出结论是,算出来的结果比实际的要大,那么不是我说的可能性。
    如果小,也许我说对了。也许你可以试试看 count += 2;
      

  2.   

    你输出count应该在while循环之外输出吧!!!
      

  3.   


    因为我的业务需要readline
      

  4.   


    文件时从linux上面弄下来的,而且我试过+2了,误差比+1要大,我想应该不是换行符的问题
      

  5.   


    你能告诉我 哪个大嘛?
    实际byte和计算的比。
    如果可以的话,你把你用来测的文本文件也贴出来给大家。
      

  6.   

    问题出在你得count += 1,我和楼主好好说说:
    假如有这么个字符串“aaabbb”存在a.txt中,其中aaa和bbb有换行,就是:
    aaa
    bbb
    这样的话你会看到此文件占用字节数为8,为什么?因为中间有个换行:正规换行时\r\n,占用了两个字节
    所以就是8个字节了,而实际真正的字节数为6(不算换行的话)
    所以如果你可以这么做:
    假如想得到带换行的字节数(就是文件属性的那个字节数)while (line != null) {
                                count += line.getBytes("UTF-8").length;
                                count += 2;    // Add \r's length
                                System.out.println(Thread.currentThread() + "  " + line);
                                System.out.println(" count:" + count);
                                line = br.readLine();
                            }
                            if(count >=2)
                            {
                                count = count -2;//因为你多加了一行
                            }如果不想要换行的字节的话,可以直接将count+=2这行去掉!
    Over~~~~~
      

  7.   


    测试的文本片段有8M,有60000多行,如果是换行符的问题那就不是几十KB的偏差了
      

  8.   


    楼主只是想取到文件大小的话方法很多。
    File file = new File(fileName);
    long count = file.length();
    System.out.println(count);
    如果是想知道为什么你的做法不对的话,
    你可以把你的8M文件缩小点,例如只有20-30行。 试试看,如果还是不对,那么把这个缩小后的文件内容贴上来。
      

  9.   


    InputStream in = new FileInputStream(file);
    System.out.println(in.available());  也可以取到文件大小。另外,这句你肯定你的文件是utf-8的?
    count += line.getBytes("utf-8").length; 
    也许字符集转换时,使得byte数不对了。
      

  10.   

    有的utf-8还有文件头,根本不会算到可输出字符,加上换行\r\n \n之类的。
    这么计算文件总长肯定不对。
      

  11.   

    楼主还是分析一下文本片断吧,
    1 搞清换行符是:"\r\n",还是"\r“,还是"\n"?
    2 编码到底是utf-8还是别的。
      

  12.   


    问题已经找出来了,确实是字符集的问题,因为linux上默认的编码和测试环境默认的编码不一样,所以引起了中文解码的字节长度不一样