Мой bufferedReader читает весь файл, а не только одну строку. Почему?

1

У меня есть 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]'
  • 0
    Возможный дубликат Как прочитать 1-ую строку файла с BufferedReader?
  • 0
    что по вашему есть 1 строка файла?
Показать ещё 4 комментария
Теги:
bufferedreader
byte

3 ответа

1

Я считаю, что проблема заключается в том, что, когда вы пишете в свой файл, вы забываете включать новые строки...

(Кроме того, что вы используете в спецификации?)

Когда вы пишете на него и используете BufferedWriter, НЕ забывайте writer.newLine() после того, как вы написали одну строку.

Обратите внимание, что вы можете использовать Files.write() для записи набора строк в файл напрямую, это вставляет новые строки для вас. Наконец, вы можете использовать Files.readAllLines() для одновременного чтения всех файлов из строки.

С Java 8 у вас также есть Files.lines().

0

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

Обратите внимание, что следующий вызов readLine() доставит вам вторую строку, а следующую 3-я строка....

РЕДАКТИРОВАТЬ :

Если вы хотите указать конкретную строку, как может показаться в вашем комментарии, вы можете использовать Apache Commons FileUtils и использовать: FileUtils.readLines(). Он предоставит вам список, который вы можете обрабатывать как любой список, включая получение определенной строки. Обратите внимание, что у него больше накладных расходов, поскольку он считывает весь файл и заполняет список его строками.

  • 1
    Почему? Java 7 имеет Files.readAllLines()
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню