【问题标题】:My bufferedReader reads through the entire file, not just one line. Why?我的 bufferedReader 读取整个文件,而不仅仅是一行。为什么?
【发布时间】:2014-12-23 12:07:53
【问题描述】:

我有一个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]`

【问题讨论】:

  • 根据你的说法是 1 行文件?
  • 如果我没听错,那么你必须确保文件不是 1 行数据,这意味着它应该有行分隔符(\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] 翻译成Name test cardNo 404604939 Current Balance 310 overdraft false overDraftLimit 0 pin 2222
  • 您的文件需要分成几行才能读取第一行,我确信您的整个文件只是一行文本,没有任何换行符。您可以先加载文件,根据您的要求将其分成几行,然后从中读取第一行。

标签: java byte bufferedreader


【解决方案1】:

我认为这里的问题是当您写入到您的文件时,您忘记包含换行符...

(另外,你对BOM有什么用?)

当你给它写信并使用BufferedWriter时,写完一行后不要忘记writer.newLine()

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

在 Java 8 中,您还拥有 Files.lines()

【讨论】:

    【解决方案2】:

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

    请注意,下一次调用 readLine() 将获得第二行,接下来是第三行....

    编辑:

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

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-02
        • 1970-01-01
        • 2019-04-12
        相关资源
        最近更新 更多