Java: как использовать bufferedreader для чтения определенной строки

Допустим, у меня есть текстовый файл с именем: 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();
}

Как изменить приведенный выше код для чтения определенной строки?


person Redbox    schedule 08.01.2013    source источник
comment
почему бы вам просто не подсчитать, в какой строке вы находитесь, и если вы находитесь в желаемом диапазоне, вы выводите строки одну за другой?   -  person Stefan    schedule 08.01.2013
comment
Как мне это сделать? я умею считать, но не уверен в выводе строки с диапазоном   -  person Redbox    schedule 08.01.2013
comment
Вы считаете, а затем проверяете счет с помощью оператора if.   -  person Peter Lawrey    schedule 08.01.2013
comment
вам, вероятно, нужен абсолютный доступ к файлам, попробуйте SeekableStream   -  person Roman C    schedule 08.01.2013
comment
Вы должны считать строки с начала файла или даже лучше парсить с помощью LineNumberReader   -  person Extreme Coders    schedule 08.01.2013
comment
любой пример был бы отличным   -  person Redbox    schedule 08.01.2013
comment
LineNumberReader в сочетании со сканером: stackoverflow.com/questions/1332297/   -  person Tobi G.    schedule 06.11.2014


Ответы (3)


Я предлагаю java.io.LineNumberReader. Он расширяет BufferedReader, и вы можете использовать его LineNumberReader.getLineNumber(); для получения текущего номера строки.

Вы также можете использовать Java 7 java.nio.file.Files.readAllLines, который возвращает List<String>, если он вам больше подходит.

Примечание:

1) предпочитайте StringBuilder StringBuffer, 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.

person Evgeniy Dorofeev    schedule 08.01.2013
comment
Вроде Redbox хочет 500-1500 и 1500 - 2000 как два отдельных текста, или так кажется - person Evgeniy Dorofeev; 08.01.2013
comment
Я хочу поместить текст (500-1500) в строку A, а затем текст (1500-2000) в строку B. Возможно ли это сделать? - person Redbox; 08.01.2013
comment
Тогда используйте LineNumberReader, это будет более эффективно - person Evgeniy Dorofeev; 08.01.2013
comment
еще 1 вопрос, StringBuilder для jdk 1.4 и выше? - person Redbox; 08.01.2013
comment
у вас есть другой способ, кроме stringbuilder? поскольку в моем проекте используется более старая версия jdk, построитель строк не работает. - person Redbox; 08.01.2013

Чуть более чистым решением было бы использовать FileUtils в apache commons. http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html Фрагмент примера:

String line = FileUtils.readLines(aFile).get(lineNumber);
person Anurag Kapur    schedule 08.01.2013
comment
мне нужно загрузить apache libs? я использую jdeveloper - person Redbox; 08.01.2013
comment
Да, файл jar apache commons-io должен быть в пути к классам. jarfinder.com/index.php/java/ информация/ - person Anurag Kapur; 08.01.2013
comment
ссылка в вашем ответе мертва. Вы найдете FileUtils здесь: commons.apache.org/proper/ Commons-IO - person Ahmed Hasn.; 06.02.2017

Лучше использовать BufferedReader. Если вы хотите прочитать строку 32, например:

for(int x = 0; x < 32; x++){
    buf.readLine();
}
lineThreeTwo = buf.readLine();

Теперь в String lineThreeTwo вы сохранили строку 32.

person Andres Cárdenas    schedule 19.11.2014
comment
BufferedReader быстрее, чем LineNumberReader. Самое быстрое решение. - person live-love; 03.10.2018