【问题标题】:BufferedReader do not read the entire text fileBufferedReader 不读取整个文本文件
【发布时间】:2019-04-12 20:16:08
【问题描述】:

我读到有人在使用 BufferedReader 时遇到问题:读者根本不会阅读第一行。相反,我有相反的问题。例如,在一个 300 行的文本文件中,它到达 200,读取它的一半,然后给下面的字符串 null,所以它停止。

private void readerMethod(File fileList) throws IOException {
    BigInteger steps = BigInteger.ZERO;
    BufferedReader br = new BufferedReader(new FileReader(fileList)); 

    String st;
    //reading file line by line
    try{
        while (true){
            st = br.readLine();
            if(st == null){
                System.out.println("Null string at line " + steps);
                break;
            }
            System.out.println(steps + " - " + st);
            steps = steps.add(BigInteger.ONE);
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    finally{
        try{
            br.close();
        }catch(Exception e){}
    }
}

前一段代码的输出与预期的一样,直到它到达第 199 行(从 0 开始)。考虑一个 300 行的文件。

... 198 - 3B02D5D572B66A82F9D21EE809320DB3E250C6C9 199 - 6E2C69795CB712C27C4097119CE2C5765 Null string at line 200

请注意,所有行都具有相同的长度,因此在此输出中,第 199 行甚至不完整。我检查了文件文本,它是正确的:它包含所有 300 行,并且它们的长度都相同。此外,如您所见,文本中只有大写字母和数字。

我的问题是:我该如何解决这个问题?我需要BufferedReader 阅读所有文本,而不仅仅是其中的一部分。

正如有人问我在这里添加代码的其余部分。请注意,所有大写名称都是各种类型的常量(int、string 等)。 这是主线程调用的方法:

public void init(){
    BufferedWriter bw = null;
    List<String> allLines = createRandomStringLines(LINES);
    try{
        String fileName = "SHA1_encode_text.txt";
        File logFile = new File(fileName);
        System.out.println(logFile.getCanonicalPath());
        bw = new BufferedWriter(new FileWriter(logFile));

        for(int i = 0; i < allLines.size(); i++){
            //write file
            String o = sha1FromString(allLines.get(i));
            //sha1FromString is a method that change the aspect of the string,
            //replacing char by char. Is not important at the moment.
            bw.write(o + "\n");
        }

    }catch(Exception e){
        e.printStackTrace();
    }finally{
        try{
            bw.close();
        }catch(Exception e){}
    }

}

创建随机字符串列表的方法如下。 “符号”只是一个包含所有可用字符的字符串。

private List<String> createRandomStringLines(int i) {
    List<String> list = new ArrayList<String>();
    while(i!=0){
        StringBuilder builder = new StringBuilder();
        int count = 64;
        while (count-- != 0) {
            int character = (int)(Math.random()*SYMBOLS.length());
            builder.append(SYMBOLS.charAt(character));
        }
        String generatedString = builder.toString();
        list.add(generatedString);
        i--;
    }
    return list;
}

请注意,写入的文件是完全正确的。

【问题讨论】:

  • 当你查看BufferedReader代码时,你可以看到大小是字符数而不是行数。我不认为这是这里的问题,但你应该解决这个问题。
  • Windows 10 的信息就足够了。请向我们展示生成文件的代码。您是否正确关闭了作者?在您尝试读取之前,可能没有正确刷新写入的文件。
  • 偶然读取文件的方法和写入文件的方法一起运行?还是在作者写完后读者才开始?
  • 请在 "bw.close();" 之后添加 "System.out.println("writer closed")"并在 BufferedReader br = new BufferedReader(new FileReader(fileList)); 之前添加 "System.out.println("reader opening"); 这两条消息将以什么顺序出现?
  • BufferedWriter 的默认缓冲区大小为 8192。读者在 8192 字节 ((40+1)*199 + 33 之后停止读取。几乎可以肯定,您的 writer 只刷新了一次。

标签: java string file bufferedreader reader


【解决方案1】:

好的,感谢用户 ygor,我设法解决了它。问题是当 BufferWriter 尚未关闭时,BufferReader 为他的工作加注星标。在bufferWriter.close() 命令之后移动需要阅读器工作的命令行就足够了。

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2021-12-21
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多