有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java My bufferedReader读取整个文件,而不仅仅是一行。为什么?

我有一个bufferedReader,它应该读取一行文本文件(已编码),解码它,并检查它是否包含一组特定的数字。它检查是否包含一组特定的数字的部分很好,但是,我有一个问题,它读取整个文件,下面是我的代码,以及从文件中读取的内容的输出以及应该如何读取,如下所示:

代码:

prviate static final String UTF8_BOM = "\uFEFF";
String cardNumberStr = "106382076";
String lineFromFile = null;
lineFromFile = bufferedReaderToWrite.readLine();
if (lineFromFile.startsWith(UTF8_BOM)) {
    lineFromFile = lineFromFile.substring(1);
}
lineFromFile = lineFromFile.substring(1, lineFromFile.length()-1);  //Convert bytes read back to String
for(String s: lineFromFile.split(", ")){    //Split every byte on ,
    sb.append((char) Integer.parseInt(s));  //Convert byte to char
}
String textToCheck = sb.toString(); //Convert StringBuilder to String
System.out.println(textToCheck);
System.out.println();
System.out.println(cardNumberStr);
if(textToCheck.contains(cardNumberStr)){
    System.out.println(lineFromFile);
}

从文件中读取的内容的输出:

106382076
78, 97, 109, 101, 32, 116, 101, 115, 116, 32, 99, 97, 114, 100, 78, 111, 32, 52,
48, 52, 54, 48, 52, 57, 51, 57, 32, 67, 117, 114, 114, 101, 110, 116, 32, 66, 9
7, 108, 97, 110, 99, 101, 32, 51, 49, 48, 32, 111, 118, 101, 114, 100, 114, 97,
102, 116, 32, 102, 97, 108, 115, 101, 32, 111, 118, 101, 114, 68, 114, 97, 102,
116, 76, 105, 109, 105, 116, 32, 48, 32, 112, 105, 110, 32, 50, 50, 50, 50
Name test cardNo 404604939 Current Balance 310 overdraft false overDraftLimit 0
pin 2222Name account cardNo 106382076 Current Balance 132 overdraft false overDr
aftLimit 0 pin 4444Name test cardNo 404604939 Current Balance 310 overdraft fals
e overDraftLimit 0 pin 2222Name account cardNo 106382076 Current Balance 132 ove
rdraft false overDraftLimit 0 pin 4444`

它应该输出:

Name test cardNo 404604939 Current Balance 310 overdraft false overDraftLimit 0
pin 2222

Name account cardNo 106382076 Current Balance 132 overdraft false overDr
aftLimit 0 pin 4444

文本文件的内容如下所示:

[78, 97, 109, 101, 32, 116, 101, 115, 116, 32, 99, 97, 114, 100, 78, 111, 32, 49, 56, 57, 52, 57, 51, 50, 56, 52, 32, 67, 117, 114, 114, 101, 110, 116, 32, 66, 97, 108, 97, 110, 99, 101, 32, 57, 52, 32, 111, 118, 101, 114, 100, 114, 97, 102, 116, 32, 102, 97, 108, 115, 101, 32, 111, 118, 101, 114, 68, 114, 97, 102, 116, 76, 105, 109, 105, 116, 32, 48, 32, 112, 105, 110, 32, 50, 51, 50, 51]
[78, 97, 109, 101, 32, 116, 101, 100, 116, 32, 99, 97, 114, 100, 78, 111, 32, 55, 48, 49, 55, 50, 53, 50, 51, 49, 32, 67, 117, 114, 114, 101, 110, 116, 32, 66, 97, 108, 97, 110, 99, 101, 32, 50, 54, 48, 32, 111, 118, 101, 114, 100, 114, 97, 102, 116, 32, 102, 97, 108, 115, 101, 32, 111, 118, 101, 114, 68, 114, 97, 102, 116, 76, 105, 109, 105, 116, 32, 48, 32, 112, 105, 110, 32, 50, 50, 50, 50]`

共 (3) 个答案

  1. # 1 楼答案

    我相信这里的问题是,当你到你的文件时,你忘了包括换行符

    (此外,您对BOM有什么用途?)

    当您写入并使用BufferedWriter时,不要忘记在写入一行之后writer.newLine()

    请注意,您可以使用^{}将一组行直接写入文件,这将为您插入新行。最后,您可以使用^{}一次读取一行中的所有文件

    在Java8中,您还有Files.lines()

  2. # 2 楼答案

    BufferReader readLine读取一行文本。一行被认为是由换行符('\n')、回车符('\r')或紧接着换行符的回车符中的任意一个终止的

    当您有多行代码时,您应该将代码放入这样的循环中,以便逐个读取每行代码:

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReaderToWrite = new BufferedReader(
            new FileReader(new File("D:/tmp/Z_Z_DELETE_ASAP/file.txt")));
    
        while ((lineFromFile = bufferedReaderToWrite.readLine()) != null) {
            StringBuilder sb = new StringBuilder();
            if (lineFromFile.startsWith(UTF8_BOM)) {
                lineFromFile = lineFromFile.substring(1);
            }
            lineFromFile = lineFromFile.substring(1, lineFromFile.length() - 1);  //Convert bytes read back to String
            for (String s : lineFromFile.split(", ")) {    //Split every byte on ,
                sb.append((char) Integer.parseInt(s));  //Convert byte to char
            }
            String textToCheck = sb.toString(); //Convert StringBuilder to String
            System.out.println(textToCheck);
            System.out.println();
            System.out.println(cardNumberStr);
            if (textToCheck.contains(cardNumberStr)) {
                System.out.println(lineFromFile);
            }
            System.out.println();
        }
    }
    

    那么输出将是:

    Name test cardNo 189493284 Current Balance 94 overdraft false overDraftLimit 0 pin 2323
    
    106382076
    
    Name tedt cardNo 701725231 Current Balance 260 overdraft false overDraftLimit 0 pin 2222
    
    106382076
    
  3. # 3 楼答案

    You can use BufferedReader.readLine() to get the first line.

    请注意,下一次调用readLine()将得到第二行,下一次调用将得到第三行

    编辑:

    如果您想要指定一个特定的行,正如您的评论所建议的,您可能想要使用ApacheCommonsFileUtils,并使用:FileUtils。readLines()。它将为您提供一个列表,您可以像处理任何列表一样处理该列表,包括获取特定行。请注意,它有更多的开销,因为它读取整个文件,并用其行填充列表