0

我有一个文件,我想打印出包含字符串的行A/C NO:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import org.apache.commons.io.FileUtils;
public class TestFndString {
    public static void main(String[] args) throws IOException {
        String str1 = FileUtils.readFileToString(new File("C:/Testing.txt"));
        LineNumberReader lnr = new LineNumberReader(new FileReader(new File("C:/Testing.txt")));
        lnr.skip(Long.MAX_VALUE);
        if (str1.contains("A/C NO:")) {
            int num = lnr.getLineNumber();
            System.out.println(num);
        }

    }
}

我的代码打印 2 作为包含该字符串的行号,而字符串实际上在第 3 行。这是我的文件示例:

jhsdjshdsjhdjs
sdkjsdkjskdjskjd
AjhsdjhsdjhA/C NO: jhsdjhsdjssdlk

显然,我不相信它可以读取更大的文件或一组文件。做这个的最好方式是什么?

4

3 回答 3

2

行号和数组索引一样,从 0 开始。将其递增 1 会给您正确的答案。

if (str1.contains("A/C NO:")) {
     int num = lnr.getLineNumber();
     System.out.println( ++num ); // see the increment using ++ ?
}  

预增量运算符将num在打印之前将变量增加 1,因此您将获得所需的结果。

于 2013-10-29T07:40:06.510 回答
1

行号从 0 开始。只需将 1 添加到您得到的结果中(只需查看JavaDoc)。或者setLineNumber(1)在创建您的之后调用LineNumberReader

LineNumberReader lnr = new LineNumberReader(new FileReader(new File("C:/Testing.txt")));
lnr.setLineNumber(1);
于 2013-10-29T07:38:28.170 回答
1

LineNumberReader从 0 开始,因此为预期结果增加 1。

来自文档

默认情况下,行号从 0 开始。随着数据的读取,该数字在每个行终止符处递增,并且可以通过调用 setLineNumber(int) 来更改。但是请注意, setLineNumber(int) 实际上并没有改变流中的当前位置;它只会更改 getLineNumber() 将返回的值。

所以有两种方法可以获得预期的结果:

1. 

LineNumberReader lnr = new 
                  LineNumberReader(new FileReader(new File("C:/Testing.txt")));        
    if (str1.contains("A/C NO:")) {
        int num = lnr.getLineNumber();
        System.out.println(num+1);
    }




2.  OR you can use setLineNumber(int) as mentioned in java docs.
于 2013-10-29T07:40:54.850 回答