使用FileReader read()和BufferedReader readLine()

时间:2019-03-25 12:09:39

标签: java bufferedreader filereader

当我使用workWithFileReader()方法时,尝试获取此文档中的字符数,并得到结果:547。 当我使用workWithBufferedReader()方法时,尝试获取此文档中的字符数,并得到结果:526。

我不确定哪个正确,所以我用单词来获取字符(包括空格),并得到答案:526。

请帮助举例说明它们之间的区别。

public static void workWithFileReader() {
        int i;
        long len;               //
        int countChar = 0;      //read byte +1
        int countLine = 0;      //get char(10) +1

        File file = new File("/Users/wayne/Downloads/Sample.txt");
        len=file.length();
        try {
            FileReader fr = new FileReader(file);
            //len = fr.available();
            while((i=fr.read()) != -1) {
                System.out.print((char)i);
                countChar++;
                if((char) i == 10) {
                    countLine++;
                }
            }

            System.out.println("----------------------");
            System.out.println("共有"+len+"個位元組");
            System.out.println("共有"+countChar+"個字元");
            System.out.println("共有"+countLine+"列資料");

            fr.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }

    public static void workWithBufferedReader() {

        String str;

        long len;
        int countChar = 0;
        int countLine = 0;


        File file = new File("/Users/wayne/Downloads/Sample.txt");
        len = file.length();
        try {
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);

            while((str=br.readLine()) != null) {
                System.out.println(str);
                countChar += str.length(); 
                countLine++;     
            }

            System.out.println("----------------------");
            System.out.println("共有"+len+"個位元組");
            System.out.println("共有"+countChar+"個字元");
            System.out.println("共有"+countLine+"列資料");


            br.close();
            fr.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

2 个答案:

答案 0 :(得分:0)

workWithFileReader()计算所有字符,包括换行符“ \ n” “ \ r”

Windows 中,操作系统文件行以两个字符“ \ r”和“ \ n”终止 您缺少的字符是那些。

在基于 unix 的OS Linux,Mac,BSD等行中,仅以“ \ n”终止 您需要意识到这种细微的差别。

workWithFileReader()仅计算行中包含的字符,不包含终止字符“ \ r”和“ \ n”

这是一个示例文件,其中显示“ \ r”和“ \ n”:enter image description here

还请注意,当到达第一个“ \ n” 时,计数必须从1而不是0 开始。

您可以使用以下内容作为参考:

package io;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class IO {

    public static void main(String[] args) throws IOException {
        String path = "C:\\1.txt";

        List<String> readAllLines = Files.readAllLines(Paths.get(path));
        System.out.println("lines: " + readAllLines.size());

        byte[] bytes = Files.readAllBytes(Paths.get(path));
        String s = new String(bytes);
        System.out.println("characters:" + s.length());
    }
}

答案 1 :(得分:0)

我检查了JAVADOC并获得了阅读专线,
就是说...此方法将以下内容识别为行终止符:

\ u000D,后跟\ u000A,回车,后跟LINE FEED \ u000A,LINE FEED \ u000D,回车

所以,我验证一下...

                if((char) i == 10) {
                    countLine++;
                    lineTerminators++;
                }

                if((char) i == 13) {
                    countLine++;
                    lineTerminators++;
                }

是的! lineTerminators得到21,547-526 = 21。