当前位置: 首页 > 面试题库 >

java:如何使用bufferedreader读取特定行

姬锐
2023-03-14
问题内容

可以说我有一个文本文件:data.txt(包含2000行)

如何从500-1500,然后从1500-2000读取给定的特定行,并显示特定行的输出?

此代码将读取整个文件(2000行)

public static String getContents(File aFile) {

        StringBuffer contents = new StringBuffer();

        try {

        BufferedReader input = new BufferedReader(new FileReader(aFile));
        try {
            String line = null;

            while (( line = input.readLine()) != null){
            contents.append(line);
            contents.append(System.getProperty("line.separator"));
            }
        }
        finally {
            input.close();
        }
        }
            catch (IOException ex){
            ex.printStackTrace();
        }

        return contents.toString();
}

如何修改上述代码以读取特定行?


问题答案:

我建议使用java.io.LineNumberReader。它扩展了BufferedReader,您可以使用它LineNumberReader.getLineNumber();来获取当前行号

您还可以使用Java 7 java.nio.file.Files.readAllLinesList<String>如果适合您,它将返回a

注意:

1)比StringBuffer更喜欢StringBuilder,StringBuffer只是一个遗留类

2)contents.append(System.getProperty("line.separator"))没有好看的使用contents.append(File.separator),而不是

3)捕获异常似乎无关紧要,我也建议更改您的代码为

public static String getContents(File aFile) throws IOException {
    BufferedReader rdr = new BufferedReader(new FileReader("aFile"));
    try {
        StringBuilder sb = new StringBuilder();
        // read your lines
        return sb.toString();
    } finally {
        rdr.close();
    }
}

现在我认为代码看起来更清晰。如果您使用的是Java 7,请使用try-with-resources

    try (BufferedReader rdr = new BufferedReader(new FileReader("aFile"))) {
        StringBuilder sb = new StringBuilder();
        // read your lines
        return sb.toString();
    }

所以最后你的代码看起来像

public static String[] getContents(File aFile) throws IOException {
    try (LineNumberReader rdr = new LineNumberReader(new FileReader(aFile))) {
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        for (String line = null; (line = rdr.readLine()) != null;) {
            if (rdr.getLineNumber() >= 1500) {
                sb2.append(line).append(File.pathSeparatorChar);
            } else if (rdr.getLineNumber() > 500) {
                sb1.append(line).append(File.pathSeparatorChar);
            }
        }
        return new String[] { sb1.toString(), sb2.toString() };
    }
}

请注意,它返回2个字符串500-1499和1500-2000



 类似资料:
  • 问题内容: 我正在阅读文件,但我不知道如何阅读口音和特殊字符,这是我阅读的代码,我必须添加其他编纂,但我不知道该怎么做 谢谢 问题答案: 请尝试以下操作:

  • 我试图创建一个简单的java服务器应用程序,但我很难用BufferedReader正确读取用户的输入。问题是行delimeter仅为CR LF(“\r\n”),因此我不能使用readLine()标准方法。因此,我尝试实现我自己的方法: 现在,当我尝试获取并打印结果时: ...它只将字符序列打印到第一个换行符(“\r”或“\n”),其余输入由第二次调用readCRLFLine(inputStream

  • 问题内容: 我正在使用Apache POI库,但是我有一些不想读取的数据-因此,我需要该程序才能从特定的行开始读取文件。 我想要来自第10行之后的单元格和行的所有数据,直到文档为空。我尝试了以下代码。 但这只会为我提供第10行中所有单元格的数据。 我期待收到您的来信:-)。 问题答案: 您仅从此处的第11行获取数据: 请参阅Sheet.getRow(int rownum) 的文档 返回基于0的逻辑

  • 我正在使用Apache POI库,但我有一些数据我不想被读取 - 所以我需要程序从特定行开始读取文件。 我需要第10行之后的单元格和行中的所有数据,直到文档为空。我已尝试使用以下代码。 但它只会给我第10行单元格的所有数据。 我期待着你的消息:-)。

  • 问题内容: 我想使用BufferedReader在控制台中输入多行文本,然后单击“ Enter”以查找整个文本长度的总和。问题在于,似乎我进入了一个无限循环,当我按“ Enter”键时,程序并没有结束。我的代码如下: 你能告诉我我在做什么错吗? 问题答案: 阅读所有行的惯用方式是。另外,我建议发表声明。就像是 如果你想,当你收到一个空行来结束循环,在添加一个测试为循环 JLS-14.15。该声明说

  • 你好,虽然我读了很多其他答案,但我不明白如何关闭BufferedReader而不发送输入。这是我程序的阻塞部分: 当我从主线程调用“endListing()”时,程序终止--但不会在用户输入任何内容之前终止。我想让程序立即终止--如何启动这个BufferdReader(像BufferedReader一样创建(新的InputStreamReader(System.in))? 我试图在主线程中的这个线