質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    13829questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • プログラミング言語

    682questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

javaでテキストファイルの特定の一行だけを読み取るには

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,754

Myyuu3

score 5

javaでテキストファイルの特定の一行だけを読み取るにはどうしたらいいですか

import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;

class sampre_proguramu{
public static void main(String args[]){
try{
File file=new File("C:\\Program Files (x86)\\Java\\sampretext.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String str=null;
for(int i=0; i<3; i++){
str=br.readLine();
if(i!=3){
str=null;
}

}
System.out.println(str);
br.close();

}catch(FileNotFoundException e){
System.out.println(e);
}catch(IOException e){
System.out.println(e);
}
}
}

3行目の値を出力したいのですが、このプログラムだと処理が終わった後に出力される値がnullになってしまいます。これはどのように解決したらいいのでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • momon-ga

    2018/01/24 16:02

    特定の一行がでるまで、読み飛ばすじゃダメですか?ファイルの読み込み方法がわからない?もう少し何ができて、何ができないか追記してください。

    キャンセル

  • Myyuu3

    2018/01/24 16:33

    ファイルを読み込むまでは出来ますがそこからどのようにプログラムを組んだらいいのかが分かりません

    キャンセル

  • 退会済みユーザー

    2018/01/24 17:52

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • unz.hori

    2018/01/24 18:45

    ファイルをオープンして、1行単位で取得し特定のワードなどでマッチングして合致したら標準出力に出力するようにすれば良いと思います。文字列でのマッチング(比較)は"java 文字列比較 パターン"などでググればいいと思います。1行単位の取得についても"java ファイル読み込み 行単位"などでググれば参考になるコードが見つかると思います。検索スキルは今後も必要になると思いますので頑張ってください。

    キャンセル

回答 4

checkベストアンサー

+2

こんな感じでどうです(4パターン)?

public class Main {
    public static void main(String[] args) throws IOException {
        if (args.length < 2) {
            System.err.println("Argument is too short.");
            return;
        }
        String line_result = null;
        Path path = Paths.get(args[0]);
        int line_number = Integer.parseInt(args[1]);

        try (Stream<String> lines = Files.lines(path)) {
            line_result = lines.skip(line_number).findFirst().orElse(null);
            if (line_result == null) System.err.println("out of lines.");
            else System.out.println(line_result);
        }

        {
            List<String> lines = Files.readAllLines(path);
            if (lines.size() < line_number) System.err.println("out of lines.");
            else {
                line_result = lines.get(line_number);
                System.out.println(line_result);
            }
        }

        try (BufferedReader br = Files.newBufferedReader(path);
                Stream<String> lines = br.lines();) {
            line_result = lines.skip(line_number).findFirst().orElse(null);
            if (line_result == null) System.err.println("out of lines.");
            else System.out.println(line_result);
        }

        try (BufferedReader br = Files.newBufferedReader(path)) {
            // skip動作
            for (int i = 0; i < line_number; i++) {
                br.readLine();
            }
            if ((line_result = br.readLine()) == null) System.err.println("out of lines.");
            else System.out.println(line_result);
        }
    }
}


追記: 質問が更新される前のを見てたのでそういうプログラムだけ乗っけました。
ここからメソッド分割などして、セクションのいずれかを使って下さい。
なお、自分も初心者なので一応動くと思いますが、正しい動作をするとは限りません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;
import java.util.Optional;

public class Q110417 {
    private static final File EXECUTABLE_PATH = Objects.requireNonNull(getExecutablePath());// アプリケーションの実行パス

    private static final File getExecutablePath() {
        File f = null;
        try {
            URL location = Q110417.class.getProtectionDomain().getCodeSource().getLocation();
            f = new File(location.toURI().getPath());
        } catch (java.net.URISyntaxException ex) {
            ex.printStackTrace();
        }
        return f;
    }
    public static void main(String[] args) {
        final int lineNumber = 3 - 1;// 行番号から-1を引いて0オリジンに変換
        // テキストのファイルパス
        Path path = Paths.get(EXECUTABLE_PATH.toString(), "sampretext.txt");
        try{
            try (BufferedReader br = Files.newBufferedReader(path)) {
                Optional<String> line = br.lines().skip(lineNumber).findFirst();
                System.out.println(line.get());
            }
        }catch(FileNotFoundException e){
            // エラーの場合は出力先は標準出力(System.out)ではなく 標準エラー出力(System.err)に
            System.err.println(e);
        }catch(IOException e){
            System.err.println(e);
        }
    }
}


■参考情報

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

n行目を取得したい、という観点では
こんなstaticメソッドを作ったら便利かもしれないですね。

static String readLineAt(BufferedReader br, int line) throws IOException {
    for(int i = 0; i < line; ++i) {
        br.readLine();
    }
    return br.readLine();
}

行数が高々知れている場合は、リストに全行放り込んだ方が楽かもしれません。

質問の仕方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

また、既に書きかけのコードがある場合、積極的に開示するようにしてください。

その他気になったこと

  • サンプルファイルの置き場所
    C:\Program Filesに個人のファイルを置くことはあまりお勧めできません。
    Windowsの場合Userフォルダ以下のどこかに置いた方が良いでしょう。
  • ファイルオブジェクトを生成していることについて
    FileReaderにはファイルパスを取るコンストラクタがありますよ。
  • ループで毎周strにnullを代入していることについて
    毎周上書きされるので無駄です。
  • 英語のスペルと命名規則について
    既存のファイルと被らないための配慮かもわかりませんが...
    sampre_proguramuじゃなくてSampleProgramだと思う。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/24 19:00 編集

    その前に3行目まで読み取って四行目以外ではnullな気がするのは気のせいだろう(多分)
    とおもったら編集で追加された場所か

    キャンセル

0

LineNumberReader
は使えるかなとおもったが表面上だけでした(謎クラス)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/24 19:09

    > setLineNumber(int)は、ストリーム内の現在位置を実際に変更するのではなく、getLineNumber()から返される値を変更するだけです。

    指定行の読み込みには使えないかも...?

    キャンセル

  • 2018/01/24 19:27

    よく読んだらそうみたいね。
    なにこの実装?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13829questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • プログラミング言語

    682questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。