Java 我的bufferedReader读取整个文件,而不仅仅是一行。为什么?

Java 我的bufferedReader读取整个文件,而不仅仅是一行。为什么?,java,byte,bufferedreader,Java,Byte,Bufferedreader,我有一个bufferedReader,它应该读取一行文本文件(已编码),解码它,并检查它是否包含一组特定的数字。它检查是否包含一组特定的数字的部分很好,但是,我有一个问题,它读取整个文件,下面是我的代码,以及从文件中读取的内容的输出以及应该如何读取,如下所示: 代码: 从文件中读取的内容的输出: 106382076 78, 97, 109, 101, 32, 116, 101, 115, 116, 32, 99, 97, 114, 100, 78, 111, 32, 52, 48, 52, 54

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

代码:

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

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]`

您可以使用BufferedReader.readLine()获取第一行。

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

编辑:

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

读取一行文本。一行被认为是由换行符('\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

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

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

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

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


使用Java 8时,您还可以使用
文件.lines()

根据您的说法,文件中的一行可能是重复的?如果我没有弄错,那么您必须确保文件不是一行数据,这意味着它应该有行分隔符(\r\n…)
[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]
它被翻译成
姓名测试卡编号404604939当前余额310透支错误透支限额0 pin 2222
您的文件需要分成几行才能只读取第一行,我确信您的整个文件只是一行文本,没有任何换行符。您可以先加载文件,将其分成几行ac到r然后从中读出第一行。
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