8

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();
}

特定の行を読み取るように上記のコードを変更するにはどうすればよいですか?

4

3 に答える 3

16

java.io.LineNumberReader をお勧めします。BufferedReader を拡張し、それを使用しLineNumberReader.getLineNumber();て現在の行番号を取得できます

より適している場合java.nio.file.Files.readAllLinesは a を返すJava 7 を使用することもできますList<String>

ノート:

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() };
    }
}

500-1499 と 1500-2000 の 2 つの文字列を返すことに注意してください。

于 2013-01-08T15:16:16.553 に答える
4

より良い方法は、BufferedReader を使用することです。たとえば、32行目を読みたい場合:

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

これで、文字列 lineThreeTwo に 32 行目が保存されました。

于 2014-11-19T14:27:22.517 に答える
4

もう少しクリーンなソリューションは、Apache Commons で FileUtils を使用することです。 http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html スニペットの例:

String line = FileUtils.readLines(aFile).get(lineNumber);
于 2013-01-08T15:16:46.053 に答える